将varchar值'WHILE('转换为数据类型int

时间:2019-09-12 15:19:55

标签: sql-server dynamic while-loop exec sp-executesql

我有以下交易:

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)一起使用,但问题仍然存在。

能否请您提出一些解决方案?

谢谢。

2 个答案:

答案 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