Operator While w SQL-kursor, który prowadzi do zerowej wartości

0

Pytanie

Mam tabela z typowymi wartościami, takimi jak: numer identyfikacyjny, numer telefonu, imię i nazwisko osoby, itp. W tej tabeli, jeśli człowiek ma więcej niż jeden numer telefonu, osoba ta będzie wyświetlany kilka razy, na każdej iteracji z innym numerem telefonu, odpowiednio tej osobie.

Moim celem jest, aby napisać kursor, który doda wszystkie inne telefony, które mają osobę, w jedną wartość telefonu w nowej tabeli, z których każdy podzielony jest znakiem",". W ten sposób każdy będzie wyświetlane w tabeli tylko jeden raz, ale w znaczeniu numer telefonu będzie podany numer telefonu, którego właścicielem jest ten człowiek, oddzielonych znakiem",".

Przyszedłem coś takiego:

Tutaj tworzę "znormalizowany" tabelę, w którą należy włożyć informacje na temat ważniejszych osobach-nowość:

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

To tymczasowa tabela wyboru identyfikatora użytkownika, który powtarza się kilka razy, co oznacza, że jest w niej kilka numerów telefonów (Telefonos_General jest tabela, z której mam dane).

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

Tutaj ogłaszam zmienne wykorzystywane w kursorze:

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

Następnie należy zadeklarować sam kursor:

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

Uruchom kursor:

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

Jest to pętla while, która zwraca @Prev_Telefono jak zero, kiedy powinien być (@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

Tutaj po prostu zamykam kursor:

END
CLOSE cursor_telefonos
DEALLOCATE cursor_telefonos

Czy ktoś wie, dlaczego mój pętli while wstawia zero w tabeli nowych telefonów, kiedy powinien dodawać lista numerów tego człowieka?

Dziękuję bardzo za uwagę!!

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

Najlepsza odpowiedź

0

Jeśli dobrze zrozumiałem, to poniżej może być prawdopodobna przyczyna .

1 - W kodzie, w którym można znaleźć identyfikator człowieka, który ma kilka numerów telefonów, a następnie bezpłatne różne numery dla tego konkretnego identyfikatora osoby po przyłączeniu się do niego za pomocą Telefonos_General. (Tutaj należy zmniejszyć swoje dane o dokumencie tożsamości, choć łączenia się tym zajmą, ale proszę, potwierdź)

2 - W kodzie reklamy zmiennej, w którym przypisaniu wartości telefon (proszę potwierdzić instrukcję else).

Uwaga-Również dla przypadku użycia można użyć funkcji agregacji wierszy, które dodadzą wszystkie numery telefonów z wartościami rozdzielanymi przecinkami. (Ja wcześniej używałem tej funkcji dla tego samego zastosowania w Postgress, ale jestem pewien, że otrzymasz ją w mssql.)

Załóżmy, że mamy dane, jak pokazano poniżej

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

Możesz użyć następującej kwerendy

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

To daje:

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

W innych językach

Ta strona jest w innych językach

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