我有以下交易:
DECLARE @strsql1 NVARCHAR(MAX);
DECLARE @rows INT, @count INT;
DECLARE @MySource NVARCHAR(30);
DECLARE @Myfield NVARCHAR(30);
SET @rows = 1;
SET @count = 0;
SELECT @strsql1 =
'WHILE ('+@rows+')> 0
BEGIN
BEGIN TRAN
delete top (10000) from '+@MySource+'
where' +@Myfield+' =''value''
SET '+@rows+' ='+ @@ROWCOUNT+'
SET '+ @count+' = '+ @count+ @rows +'
RAISERROR(''COUNT %d'', 0, 1, '+ @count+') WITH NOWAIT
COMMIT TRAN
END;'
PRINT @strsql1
EXEC sp_executeSql @strSql1
但我收到此错误消息:
将varchar值'WHILE('转换为数据类型int时,转换失败。
我尝试将强制转换与两个变量(@count和@row)一起使用,但问题仍然存在。
能否请您提出一些解决方案?
谢谢。
答案 0 :(得分:0)
第一件事,当将整数变量的值添加到字符串中时,应对其进行CAST,例如:
SELECT @strsql1 = 'WHILE (' + CAST(@rows AS varchar) +') > 0'
但是,您实际上也不想这样做……因为您想针对常数零测试变量,所以它应该更像:
SELECT @strsql1 = 'WHILE (@rows > 0)'
但是这行完全是错误的...结果将是SET 2 = 3或类似的东西,这毫无意义:
SET ' + @rows + ' =' + @@ROWCOUNT + '
所以您这里有很多问题。
它们对于动态SQL的关键不是立即执行并执行...首先尝试仅打印字符串,然后查看结果,看看问题出在哪里(应该很明显...将其复制/粘贴到其中)一个新的SSMS查询窗口,您可以立即看到问题所在),然后进行迭代,修复动态SQL生成,直到生成的SQL正确为止。然后执行它。
基本上,您需要在动态SQL中保留变量,然后通过可选参数将变量传递给sp_executesql。在线上有许多如何传递参数的示例。但是@rows的声明也可能也应包含在动态SQL中。请记住,动态sql在其OWN上下文中执行,而不是在调用代码的上下文中执行,因此它看不到任何在外部声明的变量。而且,在构建动态SQL时,您只想使用将在字符串外更改PER CALL的内容。
答案 1 :(得分:0)
也许这样会让您入门。
Name ID
0 JAMES 252.0
1 STEPHEN 578.0
2 NaN NaN
3 ROGELIO 473.0
4 NaN NaN
5 CLIFFORD 793.0