Mientras que la instrucción SQL Cursor trayendo valores null

0

Pregunta

Tengo una tabla con los valores típicos como: identificación, número de teléfono, nombre de las personas, etc. En esta tabla si una persona tiene más de un número de teléfono de esa persona aparecerá varias veces, en cada iteración con un diferente número de teléfono correspondiente a esa persona.

Mi objetivo es escribir un cursor que va a agregar todos los teléfonos que tiene una persona en un teléfono único de valor en una nueva tabla, cada uno de ellos separados por ', '. De esa manera cada persona sólo aparecen una vez en la mesa, pero los números de teléfono valor al número de teléfono de esa persona posee separados por ','.

He venido con algo como esto:

Aquí creo que el "normalizado" de la tabla que las personas que información se debe insertar:

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

Esta es una tabla temporal para seleccionar a las personas de IDENTIFICACIÓN que se repite varias veces, lo que significa que tiene varios números de teléfono (Telefonos_General es la tabla que estoy recibiendo los datos de).

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

Aquí declaro las variables utilizadas en el cursor:

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

Luego de declarar el cursor en sí:

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

Iniciar el cursor:

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

Este es el bucle while, que se está volviendo @Prev_Telefono como null cuando debería ser al (@Descarga+ ', ' + @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

Aquí acabo de cerrar el cursor:

END
CLOSE cursor_telefonos
DEALLOCATE cursor_telefonos

Alguien sabe por qué mi bucle while es la inserción de un valor nulo en los nuevos teléfonos de la tabla cuando se debe de agregar una lista de números de teléfono de esa persona?

Muchas gracias por su atención!!

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

Mejor respuesta

0

Si he entendido correcta, entonces a continuación puede ser la causa posible .

1- En el código donde se encuentran la identificación de la persona de tener múltiples número de teléfono y, a continuación, obtener los números de teléfono diferente para esa persona en particular id después de unirse con Telefonos_General. (Aquí se debe corto sus datos de identificación de la persona aunque se une a cuidar de él, pero por favor validar)

2- En la declaración de la variable código donde es la asignación de valores a la Descarga (por favor validar la instrucción else).

Nota-También para el caso de uso se puede utilizar la Cadena de funciones de Agregado que añadir todos los números de teléfono con separador de coma. (Yo previamente había utilice esta función para el mismo caso de uso en Postgress, pero estoy seguro de que va a obtener en mssql así.)

Suponga que usted tiene datos como el de abajo

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

Puede utilizar la siguiente consulta

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

Esto le dará a usted:

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

En otros idiomas

Esta página está en otros idiomas

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