如何使用 tsql 中的执行函数填充变量



已编辑:

我正在运行以下查询

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+'');

当我执行此查询时,我收到此错误:

Msg 102,级别 15,状态 1,第 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 注入攻击。如果可能,应将此查询重构为安全查询(使用全部捕获技术(。

相关内容

  • 没有找到相关文章

最新更新