Durante a instrução no SQL Cursor trazendo valores nulos

0

Pergunta

Eu tenho uma tabela com os valores típicos como: identificação, número de telefone, nome de pessoas, etc. Nesta tabela, se uma pessoa tiver mais de um número de telefone da pessoa vai aparecer várias vezes, a cada iteração, com um número de telefone diferente correspondente a essa pessoa.

Meu objetivo é escrever um cursor que irá adicionar todos os telefones de uma pessoa tem em um único telefone valor em uma nova tabela, cada um deles separados por ', '. Dessa forma, cada pessoa vai aparecer apenas uma vez na tabela, mas o números de telefone de valor terão al o número de telefone que a pessoa possui separados por ','.

Eu vim com algo como isto:

Aqui eu criar o "normalizado" tabela de que as pessoas que informações devem ser insira:

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

Esta é uma tabela temporária para selecionar pessoas de IDENTIFICAÇÃO, que é repetido várias vezes, o que significa que tem vários números de telefone (Telefonos_General é a mesa que eu estou ficando dados).

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

Aqui eu declarar as variáveis utilizadas no cursor:

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

Em seguida, declarar o cursor em si:

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 o 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 é o loop while que está retornando @Prev_Telefono como null quando deveria ser o (@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

Aqui eu só fechar o cursor:

END
CLOSE cursor_telefonos
DEALLOCATE cursor_telefonos

Alguém sabe por que o meu while é inserir null em que os novos telefones de mesa quando deve ser a adição de uma lista de números de telefone dessa pessoa?

Muito obrigado pela sua atenção!!

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

Melhor resposta

0

Se eu entendi correto, em seguida, abaixo pode ser a possível razão .

1- No código onde você está encontrando o id da pessoa ter vários números de telefone e, em seguida, obter os números de telefone diferentes para essa pessoa em particular id depois de juntar-se a ela com Telefonos_General. (Aqui você deve curto os seus dados na identificação de pessoa apesar de junta vai cuidar dele mas, por favor, validá-lo)

2- Na declaração da variável código onde você estiver atribuindo valores para Telefonos (por favor, valide a instrução else).

Nota-se Também para o caso de uso você pode usar a Seqüência de funções de Agregação que irá adicionar todos os números de telefone com separador de vírgula. (Eu já tinha use esta função para o mesmo caso de uso em Postgress, mas eu tenho certeza que você vai buscá-la na mssql bem.)

Suponha que você tenha os dados como abaixo

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

Você pode usar abaixo consulta

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

Isso dará a você:

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

Em outros idiomas

Esta página está em outros idiomas

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