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



我有以下事务:

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

但我收到此错误消息:

将变量值 ' WHILE (' 转换为数据类型 int 时转换失败。

我尝试将强制转换与两个变量(@count 和 @row(一起使用,但问题仍然存在。

你能提出一些解决方案吗?

谢谢。

首先,当将整数变量的值添加到字符串中时,您应该 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 的内容。

也许这样的事情会让你开始。

declare @MySource sysname = 'YourTableName'
, @MyField sysname = 'YourFieldName'
, @strsql1 NVARCHAR(MAX)
SELECT @strsql1 = 
'DECLARE @rows INT = 1;
WHILE @rows > 0
BEGIN
delete top (10000)  from ' + QUOTENAME(@MySource)
+ ' where ' + QuoteName(@Myfield) + '=''value'';
SET @rows = @@ROWCOUNT;
print convert(varchar(10), @rows) + '' row(s) affected'';
END;'
PRINT @strsql1
--EXEC sp_executeSql @strSql1

相关内容

  • 没有找到相关文章

最新更新