Оператор While в SQL-курсоре, приводящий к нулевым значениям

0

Вопрос

У меня есть таблица с типичными значениями, такими как: идентификационный номер, номер телефона, имя человека и т.д. В этой таблице, если у человека более одного телефонного номера, этот человек будет отображаться несколько раз, на каждой итерации с другим номером телефона, соответствующим этому человеку.

Моя цель состоит в том, чтобы написать курсор, который добавит все разные телефоны, которые есть у человека, в одно значение телефона в новой таблице, каждый из которых разделен знаком",". Таким образом, каждый человек будет отображаться в таблице только один раз, но в значении номера телефона будет указан номер телефона, которым владеет этот человек, разделенный знаком",".

Я пришел с чем-то вроде этого:

Здесь я создаю "нормализованную" таблицу, в которую следует вставить информацию о персонах:

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

Это временная таблица для выбора идентификатора пользователя, которая повторяется несколько раз, что означает, что в ней несколько телефонных номеров (Telefonos_General-это таблица, из которой я получаю данные).

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

Здесь я объявляю переменные, используемые в курсоре:

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

Затем объявите сам курсор:

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

Запустите курсор:

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

Это цикл while, который возвращает @Prev_Telefono как нулевой, когда он должен быть (@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

Здесь я просто закрываю курсор:

END
CLOSE cursor_telefonos
DEALLOCATE cursor_telefonos

Кто-нибудь знает, почему мой цикл while вставляет нуль в таблицу новых телефонов, когда он должен добавлять список телефонных номеров этого человека?

Большое спасибо за ваше внимание!!

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

Лучший ответ

0

Если я правильно вас понял, то ниже может быть возможная причина .

1 - В коде, в котором вы находите идентификатор человека, имеющего несколько телефонных номеров, а затем получаете разные телефонные номера для этого конкретного идентификатора человека после присоединения к нему с помощью Telefonos_General. (Здесь вы должны сократить свои данные об удостоверении личности, хотя объединения позаботятся об этом, но, пожалуйста, подтвердите его)

2 - В коде объявления переменной, в котором вы присваиваете значения телефонам (пожалуйста, подтвердите инструкцию else).

Примечание-Также для вашего случая использования вы можете использовать функции агрегирования строк, которые добавят все телефонные номера с разделителем-запятой. (Я ранее использовал эту функцию для того же случая использования в Postgress, но я уверен, что вы также получите ее в mssql.)

Предположим, у вас есть данные, как показано ниже

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

Вы можете использовать следующий запрос

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

Это даст вам:

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

На других языках

Эта страница на других языках

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