În timp ce declarație în SQL Cursorul aduce valori null

0

Problema

Am un tabel cu valori tipice, cum ar fi: de identificare, numărul de telefon, nume de persoane etc. În acest tabel, dacă o persoană are mai mult de un număr de telefon la care persoana va apărea de mai multe ori, fiecare iterație cu un alt număr de telefon corespunzătoare pentru acea persoană.

Scopul meu este de a scrie un cursor care se va adăuga toate diferite telefoane în care o persoană are într-un singur telefon de valoare într-un tabel nou, fiecare dintre ele separate prin ', '. În acest fel, fiecare persoană va apărea o singură dată în tabel, dar numerele de telefon pe valoarea va fi al numărul de telefon pe care persoana deține separate prin ','.

Am venit cu ceva de genul asta:

Aici am crea "normalizat" tabel care persoanele informații ar trebui să fie introduce:

CREATE TABLE IF NOT EXISTS Telefono_General_V2 (Cedula_v2 varchar(50),Nombre_v2 varchar(50),Cantidad int, Telefono_v2 varchar(max))

Acesta este un tabel temporar pentru a selecta persoanele de IDENTITATE care se repetă de mai multe ori, ceea ce înseamnă că are mai multe numere de telefon (Telefonos_General este masa sunt obtinerea de date de la).

SELECT  Cedula_v1 AS Cedula, COUNT(1) AS cantidad_repetidos
INTO #DatosRepetidosTemp
FROM Telefonos_General
GROUP BY Cedula_v1
HAVING  COUNT(1) >1

Aici declar variabilele utilizate în cursorului:

DECLARE
@Cedula varchar(50),
@Cuenta int,
@Prev_Telefono varchar(max),
@Telefonos varchar(max)

Apoi declară cursorul în sine:

DECLARE cursor_telefonos CURSOR FOR 
SELECT TOP (100) Cedula, cantidad_repetidos, Telefono_v1
FROM #DatosRepetidosTemp     
JOIN Telefonos_General on Cedula_v1 = Cedula
WHERE  Cedula is not null

Începe cursorul:

OPEN cursor_telefonos  
FETCH NEXT FROM cursor_telefonos 
INTO @Cedula, @Cuenta, @Prev_Telefono
WHILE @@FETCH_STATUS = 0   
BEGIN  
    IF @Telefonos = NULL
        SET @Telefonos = @Prev_Telefono
    ELSE

Aceasta este o buclă în timp ce se întoarce @Prev_Telefono ca nul atunci când aceasta ar trebui să fie (@Telefonos+ ', ' + @Prev_Telefono).

    WHILE @Cuenta != 0
    BEGIN
        SET @Telefonos = @Telefonos+ ', ' + @Prev_Telefono
        SET @Prev_Telefono = @Telefonos
        SET @Cuenta = @Cuenta - 1

    END
    INSERT IGNORE INTO Telefono_General_V2 (Cedula_v2, Cantidad, Telefono_v2)
    VALUES (@Cedula, @Cuenta, @Telefonos)

    FETCH NEXT FROM cursor_telefonos INTO @Cedula, @Cuenta, @Telefonos

Aici am doar închide cursorul:

END
CLOSE cursor_telefonos
DEALLOCATE cursor_telefonos

Stie cineva de ce mi buclă în timp ce este inserarea nul pe noile telefoane masă când ar trebui să fie adăugarea de o listă de numere de telefon de acea persoană?

Mulțumesc mult pentru atenție!!

database database-cursor sql
2021-11-24 02:51:22
1

Cel mai bun răspuns

0

Dacă am înțeles corect, atunci mai jos poate fi posibil motiv .

1- În cod în cazul în care vă sunt găsirea persoanei id-ul având mai multe numărul de telefon și apoi să numere de telefon diferite pentru o anumită persoană de identitate după aderarea cu Telefonos_General. (Aici ar trebui scurt datele privind persoana id deși se alătură va avea grijă de ea, dar vă rugăm să-l valida)

2- În declarația variabilei cod în cazul în care sunteți atribuirea de valori pentru Telefonos (vă rugăm să valideze declarația altceva).

Nota-de Asemenea, pentru cazul dumneavoastră de utilizare puteți folosi Șir de funcții Agregate care se va adăuga toate numerele de telefon cu separatorul virgula. (Am avut anterior, utilizați această funcție pentru același caz de utilizare în Postgress dar eu sunt sigur că va ajunge în mssql la fel de bine.)

Să presupunem că ai datele de mai jos

name    date1
 A    2019-03-01
 B    2020-03-01
 A    2021-03-01
 B    2022-03-01
 C    2023-03-01

Puteți utiliza de mai jos interogare

select name,string_agg(date1,',') as merge_date from table_name group by name

Acest lucru vă va oferi:

name    merge_date
 A    2019-03-01,2021-03-01
 B    2022-03-01,2020-03-01
 C    2023-03-01
2021-11-24 04:51:29

În alte limbi

Această pagină este în alte limbi

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................