【问题标题】:Set @Variable1 within a stored proc by executing @Variable2通过执行@Variable2 在存储过程中设置@Variable1
【发布时间】: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


【解决方案1】:

动态 SQL 需要小心处理:

DECLARE @Counter NVARCHAR(1000);

DECLARE @COUNT BIGINT;
DECLARE @DATATOFIND VARCHAR(100) = 'za02';
DECLARE @TABLE SYSNAME = N'UserGrp';
DECLARE @COLUMN SYSNAME = N'UserId';

SET @Counter = N'SELECT @COUNT = COUNT(<column_name>) 
FROM <table_name> 
WHERE CONVERT(VARCHAR(MAX),<column_name>) = @DATATOFIND;';

SET @Counter = REPLACE(@Counter, '<column_name>', QUOTENAME(@COLUMN));
SET @Counter = REPLACE(@Counter, '<table_name>', QUOTENAME(@TABLE));

PRINT @Counter; -- debug

EXECUTE sp_executesql @Counter, 
       N'@DATATOFIND VARCHAR(100), @COUNT BIGINT OUTPUT',
       @DATATOFIND,
       @COUNT OUTPUT;

SELECT @COUNT;

db<>fiddle demo

最低:

  • params 是参数,不是串联的字符串
  • 标识符(此处为列/表名)- 应引用例如使用QUOTENAME 函数
  • 最好打印查询以查看它是否符合预期
  • 在动态查询中设置的参数可以通过将它们定义为 OUTPUT 传递给外部块

【讨论】:

    猜你喜欢
    • 2014-10-19
    • 1970-01-01
    • 2010-09-15
    • 2011-12-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-24
    • 1970-01-01
    相关资源
    最近更新 更多