如何使用sql中的执行函数填充变量?
How to populate variable using execution function in 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, Level 15, State 1, Line 1 Incorrect syntax near '='.
过滤器是我需要使用的动态变量,这就是我使用执行函数的原因。
如何使用执行函数填充声明的变量?
当你确实需要执行带输出参数的动态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 注入攻击。 如果可能,您应该将此查询重构为安全的内容(使用 catch-all 技术)。
已编辑:
我是运行下面的查询
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, Level 15, State 1, Line 1 Incorrect syntax near '='.
过滤器是我需要使用的动态变量,这就是我使用执行函数的原因。 如何使用执行函数填充声明的变量?
当你确实需要执行带输出参数的动态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 注入攻击。 如果可能,您应该将此查询重构为安全的内容(使用 catch-all 技术)。