T-SQL 中的光标不起作用
Cursor in T-SQL doesn't work
我正在使用游标将数据从一个 table(Family_tree) 随机复制到另外两个 tables(Family_tree1 + @time, Family_tree2 + @时间)。代码执行成功,但没有更新行。实际上有从 table 复制的内容。
我正在使用 Microsoft SQL Server Management Studio。这是带有光标的脚本部分:
---creating two tables beforehand
DECLARE @random int
DECLARE
@first_name nvarchar(20),
@last_name AS nvarchar(20),
@date_of_birth AS nchar(10),
@date_of_death AS nchar(10),
@place_of_death AS nvarchar(30),
@credit_card AS nchar(16),
@ID_member AS int,
@FK_gender AS nchar(3),
DECLARE curs CURSOR FOR SELECT first_name, last_name, date_of_birth, date_of_death, place_of_death, credit_card, ID_member, FK_gender, FROM Family_tree
OPEN curs
FETCH NEXT FROM curs INTO @first_name, @last_name, @date_of_birth, @date_of_death, @place_of_death, @credit_card, @ID_member, @FK_gender,
WHILE @@FETCH_STATUS = 0
BEGIN
SET @random = RAND() * 1000000
IF @random % 2 = 1
BEGIN
SET @sqlString = 'INSERT INTO [Family_tree1' + @time + '] (first_name, last_name, date_of_birth, date_of_death, place_of_death, credit_card, ID_member, FK_gender)
VALUES ('
+ @first_name + ',' + @last_name + ',' + @date_of_birth + ',' + @date_of_death + ',' + @place_of_death + ',' + @credit_card + ','
+ CAST(@ID_member AS nvarchar) +','+ @FK_gender + ')'
END
ELSE
BEGIN
SET @sqlString = 'INSERT INTO [Family_tree2' + @time + '] (first_name, last_name, date_of_birth, date_of_death, place_of_death, credit_card, ID_member, FK_gender)
VALUES (' + @first_name + ',' + @last_name + ',' + @date_of_birth + ',' + @date_of_death + ',' + @place_of_death + ',' + @credit_card + ','
+ CAST(@ID_member AS nvarchar) +','+ @FK_gender + ')'
END
EXECUTE(@sqlString)
FETCH NEXT FROM curs INTO @first_name, @last_name, @date_of_birth, @date_of_death, @place_of_death, @credit_card, @ID_member, @FK_gender
END
CLOSE curs
DEALLOCATE curs
END;
我是 T-SQL 的新手,非常感谢任何建议!
提前谢谢你(:
如果您 "have" 在游标中执行此操作,则需要注意空值。您还需要注意您正在使用字符串这一事实,当插入到 VALUES
子句中时,这些字符串应该被 引用 。
而不是
VALUES (' + @first_name + ',
你需要这样的东西:
VALUES (' + COALESCE('''' + REPLACE(@first_name,'''','''''') + '''','NULL') + ',
您的其他价值观依此类推。这会将值中的任何单引号替换为双引号,然后将整个字符串用单引号引起来。 NULL
s 在所有这些处理过程中幸存下来,因此我们还使用 COALESCE
将最终字符串 1[= 中的 NULL
替换为 NULL
文字41=].
在 运行 光标处于愤怒状态之前,我建议您对一行执行此操作并打印字符串而不是执行它,以检查它 "looks right".
我还建议您考虑使用更好的数据类型 - birth/death 的日期作为实际 date
值而不是字符串处理会更好。
1Guido 在评论中建议 ISNULL
,这与 COALESCE
类似,但有一些奇怪的限制,我通常建议不要使用。他们还建议替换应该是一个空字符串,但这里会导致 VALUES(... ,, ...)
在 NULL
值的位置,这会产生错误。
我正在使用游标将数据从一个 table(Family_tree) 随机复制到另外两个 tables(Family_tree1 + @time, Family_tree2 + @时间)。代码执行成功,但没有更新行。实际上有从 table 复制的内容。 我正在使用 Microsoft SQL Server Management Studio。这是带有光标的脚本部分:
---creating two tables beforehand
DECLARE @random int
DECLARE
@first_name nvarchar(20),
@last_name AS nvarchar(20),
@date_of_birth AS nchar(10),
@date_of_death AS nchar(10),
@place_of_death AS nvarchar(30),
@credit_card AS nchar(16),
@ID_member AS int,
@FK_gender AS nchar(3),
DECLARE curs CURSOR FOR SELECT first_name, last_name, date_of_birth, date_of_death, place_of_death, credit_card, ID_member, FK_gender, FROM Family_tree
OPEN curs
FETCH NEXT FROM curs INTO @first_name, @last_name, @date_of_birth, @date_of_death, @place_of_death, @credit_card, @ID_member, @FK_gender,
WHILE @@FETCH_STATUS = 0
BEGIN
SET @random = RAND() * 1000000
IF @random % 2 = 1
BEGIN
SET @sqlString = 'INSERT INTO [Family_tree1' + @time + '] (first_name, last_name, date_of_birth, date_of_death, place_of_death, credit_card, ID_member, FK_gender)
VALUES ('
+ @first_name + ',' + @last_name + ',' + @date_of_birth + ',' + @date_of_death + ',' + @place_of_death + ',' + @credit_card + ','
+ CAST(@ID_member AS nvarchar) +','+ @FK_gender + ')'
END
ELSE
BEGIN
SET @sqlString = 'INSERT INTO [Family_tree2' + @time + '] (first_name, last_name, date_of_birth, date_of_death, place_of_death, credit_card, ID_member, FK_gender)
VALUES (' + @first_name + ',' + @last_name + ',' + @date_of_birth + ',' + @date_of_death + ',' + @place_of_death + ',' + @credit_card + ','
+ CAST(@ID_member AS nvarchar) +','+ @FK_gender + ')'
END
EXECUTE(@sqlString)
FETCH NEXT FROM curs INTO @first_name, @last_name, @date_of_birth, @date_of_death, @place_of_death, @credit_card, @ID_member, @FK_gender
END
CLOSE curs
DEALLOCATE curs
END;
我是 T-SQL 的新手,非常感谢任何建议! 提前谢谢你(:
如果您 "have" 在游标中执行此操作,则需要注意空值。您还需要注意您正在使用字符串这一事实,当插入到 VALUES
子句中时,这些字符串应该被 引用 。
而不是
VALUES (' + @first_name + ',
你需要这样的东西:
VALUES (' + COALESCE('''' + REPLACE(@first_name,'''','''''') + '''','NULL') + ',
您的其他价值观依此类推。这会将值中的任何单引号替换为双引号,然后将整个字符串用单引号引起来。 NULL
s 在所有这些处理过程中幸存下来,因此我们还使用 COALESCE
将最终字符串 1[= 中的 NULL
替换为 NULL
文字41=].
在 运行 光标处于愤怒状态之前,我建议您对一行执行此操作并打印字符串而不是执行它,以检查它 "looks right".
我还建议您考虑使用更好的数据类型 - birth/death 的日期作为实际 date
值而不是字符串处理会更好。
1Guido 在评论中建议 ISNULL
,这与 COALESCE
类似,但有一些奇怪的限制,我通常建议不要使用。他们还建议替换应该是一个空字符串,但这里会导致 VALUES(... ,, ...)
在 NULL
值的位置,这会产生错误。