Tandis que la déclaration de Curseur SQL apportant des valeurs null

0

La question

J'ai un tableau avec des valeurs typiques comme: l'identification, numéro de téléphone, nom des personnes etc. Dans ce tableau, si une personne a plus d'un numéro de téléphone de cette personne apparaît plusieurs fois, à chaque itération avec un autre numéro de téléphone correspondant à cette personne.

Mon but est d'écrire un curseur qui va ajouter tous les téléphones différents d'une personne a un numéro de téléphone unique valeur dans une nouvelle table, chacun d'entre eux séparés par des ', '. De cette façon, chaque personne qu'une seule fois dans la table, mais les numéros de téléphone de la valeur de al le numéro de téléphone que la personne possède séparés par des ','.

Je suis venu avec quelque chose comme ceci:

Ici, j'ai créer le "normalisé" de la table que les personnes info doit être insérer:

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

C'est une table temporaire pour sélectionner les personnes dont l'ID est répété plusieurs fois, le sens qu'il a plusieurs numéros de téléphone (Telefonos_General est la table, je reçois les données).

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

Ici, je déclare les variables utilisées dans le curseur:

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

Ensuite déclarer le curseur lui-même:

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

Démarrer le curseur:

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

C'est la boucle while qui est de retour @Prev_Telefono nulle alors qu'elle devrait être l' (@Originaux+ ', ' + @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

Ici, je viens de fermer le curseur:

END
CLOSE cursor_telefonos
DEALLOCATE cursor_telefonos

Quelqu'un sait pourquoi ma boucle while est d'insérer la valeur null sur les nouveaux téléphones de la table alors qu'elle devrait être l'ajout d'une liste de numéros de téléphone de cette personne?

Merci beaucoup pour votre attention!!

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

La meilleure réponse

0

Si j'ai bien compris vous corriger puis ci-dessous peut être la raison possible .

1- Dans le code où vous trouvez la personne de l'id d'avoir plusieurs numéro de téléphone et les numéros de téléphone différents pour cette personne en particulier de l'id après avoir rejoint avec Telefonos_General. (Ici, vous devez court de vos données sur la personne d'id bien que les jointures de prendre soin d'elle mais s'il vous plaît ne le valider)

2- Dans la déclaration de la variable code où vous êtes l'attribution des valeurs aux Originaux (veuillez valider le else).

Remarque: Également pour votre cas d'utilisation, vous pouvez utiliser des chaînes de caractères les fonctions d'Agrégation, de manière à ajouter tous les numéros de téléphone avec la virgule comme séparateur. (J'avais déjà utiliser cette fonction pour le même cas d'utilisation dans Postgress, mais je suis sûr que vous allez obtenir dans mssql ainsi.)

Supposons que vous disposez de données comme ci-dessous

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

Vous pouvez utiliser la requête ci-dessous

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

Cela vous donnera:

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

Dans d'autres langues

Cette page est dans d'autres langues

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