Zatímco v SQL Kurzor přináší hodnoty null

0

Otázka

Mám tabulku s typickými hodnotami, jako jsou: identifikace, telefonní číslo, jméno osoby atd. V této tabulce, pokud má člověk více než jedno telefonní číslo, které člověk objeví vícekrát, každé iteraci se jiné telefonní číslo, odpovídající této osobě.

Mým cílem je napsat kurzor, který bude přidat všechny různé telefony má člověk v jednom telefonu hodnotu v nové tabulky, každý z nich odděleny",". V tom, že způsob, jak každý člověk se objeví pouze jednou v tabulce, ale telefonní čísla, hodnotu bude mít al telefonní číslo, které osoba vlastní oddělené ','.

Přišel jsem s něčím, jako je tento:

Tady jsem se vytvořit "normalizované" stolu, že osoby, které informace by měly být vložit:

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

Jedná se o dočasné tabulky vyberte osoby ID, že se opakuje několikrát, což znamená, že má více telefonních čísel (Telefonos_General je stůl jsem dostat data z).

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

Zde prohlašuji, že proměnné použité v kurzoru:

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

Pak deklarovat kurzor sám:

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

Start kurzor:

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

To je while, který se vrací @Prev_Telefono jako null, když by to mělo být (@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

Tady jsem jen v blízkosti kurzoru:

END
CLOSE cursor_telefonos
DEALLOCATE cursor_telefonos

Někdo ví, proč je můj, zatímco smyčka je vkládání null na nové telefony stolu, když by to mělo být přidání seznamu telefonní čísla, která člověk?

Díky moc za vaši pozornost!!

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

Nejlepší odpověď

0

Rozumím-li vám správně, tak níže může být možný důvod .

1- V kódu, kde jste najít člověka, id s vícenásobné telefonní číslo, a pak se dostat na jiná telefonní čísla, na která konkrétní osoba id po vstupu to s Telefonos_General. (Zde byste měli krátkou vaše údaje na osobu, id, i když se připojí se bude starat o to, ale prosím, ověřit to)

2- V deklaraci proměnné kód, kde jste přiřazení hodnoty Telefonos (prosím potvrďte prohlášení jiného).

Poznámka-Také pro váš případ použití, můžete použít Řetězec Agregační funkce, která bude-li přidat všechny telefonní čísla s čárkou oddělovače. (Měl jsem dříve tuto funkci použijte pro stejný případ použití v Postgress, ale jsem si jist, že dostanete to v mssql stejně.)

Předpokládám, že máte údaje, jako je níže

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

Můžete použít níže dotaz

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

To vám dá:

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

V jiných jazycích

Tato stránka je v jiných jazycích

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