【发布时间】:2021-11-24 02:51:22
【问题描述】:
我得到了一个包含典型值的表格,例如:身份、电话号码、人名等。在这个表格中,如果一个人有多个电话号码,该人将出现多次,每次迭代都有一个对应的不同电话号码人。
我的目标是编写一个光标,它将一个人所有不同的音素添加到一个新表中的单个音素值中,每个音素都用“,”分隔。这样每个人只会在表格中出现一次,但电话号码值将包含该人拥有的所有电话号码,并用“,”分隔。
我有这样的东西:
在这里我创建了应该插入人员信息的“规范化”表:
CREATE TABLE Telefono_General_V2 (Cedula_v2 varchar(50),Nombre_v2 varchar(50),Cantidad int, Telefono_v2 varchar(max))
这是一个用于选择重复多次的人员 ID 的临时表,这意味着它有多个电话号码(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
这是当 @Prev_Telefono 应该是 (@Telefonos+ ', ' + @Prev_Telefono) 时返回 null 的 while 循环。
WHILE @Cuenta != 0
BEGIN
SET @Telefonos = @Telefonos+ ', ' + @Prev_Telefono
SET @Prev_Telefono = @Telefonos
SET @Cuenta = @Cuenta - 1
END
INSERT 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 循环在应该添加该人的电话号码列表时在新的电话表中插入 null 吗?
非常感谢您的关注!!
【问题讨论】:
-
使用
is null而不是相等。您不需要在循环中读取新值吗?
标签: sql database database-cursor