【发布时间】:2020-11-29 01:19:31
【问题描述】:
我想通过在存储过程的 Begin Try 中执行 @Counter 来设置 @Count 的值。
SET @Counter ='SET @Count = (SELECT COUNT(' + @COLUMN + ') FROM ' + @TABLE + ' WHERE CONVERT(VARCHAR(MAX),' + @COLUMN + ') = ''' + @DATATOFIND + ''')'
我已经测试了上面的代码,它确实给了我在存储过程之外的普通 sql 语句中填充 @Count 变量的预期结果。
一旦填充了@Count 变量,我想在打印语句中使用它。
PRINT '-- No. of Entries in the ' + @TABLE + ' Table = ' + @Count
我尝试了以下两个选项来填充@Count,但都没有成功
EXEC @Counter
and
EXECUTE sp_executesql (@Counter)
更新:
经过更多研究,我尝试了这个:
DECLARE @Counter NVARCHAR(1000)
SET @Counter = N'DECLARE @Count NVARCHAR(100); SET @COUNT = (SELECT COUNT(UserId) FROM UserGrp WHERE CONVERT(VARCHAR(MAX),UserId) = ''za02'')'
EXECUTE sp_executesql @Counter
Print @Count
但我收到此错误: 必须声明标量变量“@Count”
更新:我的情况的解决方法/解决方案
DECLARE @Counter NVARCHAR(2000)
SET @Counter = 'DECLARE @Count NVARCHAR(100); SET @COUNT = (SELECT COUNT(UserId) FROM UserGrp WHERE CONVERT(VARCHAR(MAX),UserId) = 'to01'); Print '/* No. of Entries in the UserGrp Table - ' + @Count + ' */''
EXEC (@Counter)
这在我的结果中为我提供了明确的信息,以决定如何处理从存储过程的其余部分创建的代码
【问题讨论】:
-
您是否尝试将 output 参数添加到
sp_executesql调用中,如文档页面上的示例 C 所示?见SQL Injection。 -
小心
'...' + @COLUMN + '...'如果您没有正确引用@COLUMN,则很容易被注射。 -
... 或
@Table或参数化@DateToFind。 -
感谢您的提醒!此存储过程用于通过 SSMS 查找和更改数据。完成后,它将被删除 =) 我尝试使用 sp_executesql OUTPUT 一点。我不知道如何将其合并到我的 PRINT 语句中。
标签: sql-server tsql variables stored-procedures