【问题标题】:How to populate variable using execution function in tsql?如何使用sql中的执行函数填充变量?
【发布时间】:2018-03-21 15:04:06
【问题描述】:

编辑:

我正在运行以下查询

DECLARE @value0 INT; 
DECLARE @filter = 'values.country = ''Germany''';
EXEC('SELECT 
'+@value0+' = SUM(CASE WHEN valuecolumn >= 0   
AND valuecolumn < 31  THEN POWER(2, valuecolumn - 0) ELSE 0 END) ,
'+@value1+' = SUM(CASE WHEN valuecolumn >= 32  AND valuecolumn < 63  THEN 
POWER(2, valuecolumn - 32)  ELSE 0 END)
FROM dbo.values
where '+@filter+'');

当我执行这个查询时,我收到了这个错误:

消息 102,级别 15,状态 1,第 1 行 '=' 附近的语法不正确。

过滤器是我需要使用的动态变量,这就是我使用执行功能的原因。 如何使用执行函数填充声明的变量?

【问题讨论】:

  • 你为什么首先使用动态 SQL?
  • @Zohar Peled 我编辑了我的问题作为对您问题的回答
  • 我已经编辑了我的答案...

标签: sql sql-server tsql exec execution


【解决方案1】:

当你确实需要执行带有输出参数的动态sql时,你必须使用sp_executesql:

DECLARE @sql NVARCHAR(1500),
        @ParmDefinition NVARCHAR(500),
        @value0 INT,
        @filter NVARCHAR(1000);

-- Set the @filter values here....

SET @sql = 'SELECT @result = SUM(
                   CASE WHEN valuecolumn >= 0 AND valuecolumn < 31 THEN 
                       POWER(2, valuecolumn - 0)
                   ELSE 
                       0 
                   END) FROM dbo.values
             WHERE '+ @filter

SET @ParmDefinition = N'@result int OUTPUT';

EXEC sp_executesql @Sql, @ParmDefinition, @result = @value0 OUTPUT;

请注意,@Filter 参数的这种使用容易受到 SQL 注入攻击。如果可能,您应该将此查询重构为安全的(使用包罗万象的技术)。

【讨论】:

  • 必须声明标量变量“@result”。
  • 当我声明:将 varchar 值 'SELECT' 转换为数据类型 int 时转换失败。我不太确定这是如何工作的
  • 抱歉,我在exec 语句中放错了@result@value0。编辑了我的答案。
  • 如果我有 value0 = sum(), value1 = sum(), value2 = sum(), value3 = sum().. 等等我必须为他们每个人做不同的 ParmDefinition?
  • 不,你将它们连接起来:SET @ParmDefinition = N'@value0 int output, @value1 int output, @value3 int output'...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-10-18
  • 1970-01-01
  • 2021-04-07
  • 1970-01-01
  • 2021-08-23
  • 1970-01-01
  • 2017-05-23
相关资源
最近更新 更多