Pri vyhlásenie v SQL Kurzor prinášať hodnoty null

0

Otázka

Mám tabuľku s typickými hodnotami ako: identifikácia, telefónne číslo, meno osoby atď. V tejto tabuľke a ak osoba, ktorá má viac než jedno telefónne číslo, ktoré osoby sa objaví viackrát, každá iterácia s rôznymi telefónne číslo, zodpovedajúce tejto osobe.

Môj cieľ je písať kurzor, že bude pridávať na všetky jednotlivé telefóny sa osoba, ktorá má v jednom telefóne hodnota v novej tabuľke, každá z nich oddelené ', '. Týmto spôsobom každý človek sa bude zobrazovať iba raz v tabuľke, ale telefónne čísla hodnotu bude mať al telefónne číslo, ktoré človek vlastní oddelené ','.

Ja som prišiel s niečím, ako je tento:

Tu som sa vytvoriť "normalizovaná" tabuľka, že osoby, ktoré informácie by mali byť vložiť:

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

Toto je dočasná tabuľka na výber osôb, ID, ktoré sa opakujú viackrát, čo znamená, že má viac telefónnych čísel (Telefonos_General je tabuľka som získanie dát z).

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

Tu som deklarovať premenné použité v kurzor:

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

Potom vyhlásiť 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

Štart 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

Toto je zároveň slučka, ktorá sa vracia @Prev_Telefono ako null, keď by to malo byť (@Náklady+ ', ' + @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

Tu som len blízkosti kurzora:

END
CLOSE cursor_telefonos
DEALLOCATE cursor_telefonos

Niekto vie, prečo my, zatiaľ čo slučky je vkladanie null na nové telefóny, tabuľky, keď by to malo byť pridaním zoznam telefónne čísla, ktoré človek?

Ďakujeme za vašu pozornosť!!

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

Najlepšiu odpoveď

0

Ak som pochopil si správne potom pod môže byť možným dôvodom .

1- V kóde, kde ste nájsť id osoby, ktoré majú viacero telefónne číslo a potom dostať rôzne telefónne čísla pre konkrétnu osobu, id po spojení s Telefonos_General. (Tu by ste mali krátke vaše údaje na osobu, id hoci pripojí sa postará o to, ale prosím potvrdiť, že)

2- V premennej vyhlásenie kód, kde ste priradenie hodnôt do Náklady (prosím overiť iný ziskov a strát).

Poznámka--Aj pre vaše použitie prípade môžete použiť Reťazec Agregačné funkcie, ktoré sa pridať všetky telefónne čísla s čiarkou oddeľovač. (Som predtým použiť túto funkciu, pre rovnaký prípad použitia v Postgress, ale som si istý, že dostanete ho v mssql, rovnako.)

Predstavte si, že ste boli dáta ako nižšie

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žiť nižšie dopyt

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

To vám poskytne:

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 iných jazykoch

Táto stránka je v iných jazykoch

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