如何在tsql中使用执行函数填充变量?
编辑: 我正在运行以下查询如何在tsql中使用执行函数填充变量?,sql,sql-server,tsql,exec,execution,Sql,Sql Server,Tsql,Exec,Execution,编辑: 我正在运行以下查询 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 v
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:
请注意,使用@Filter参数容易受到SQL注入攻击。如果可能,您应该使用“一网打尽”技术将此查询重构为安全的查询。当您确实需要使用输出参数执行动态sql时,必须使用sp_executesql:
请注意,使用@Filter参数容易受到SQL注入攻击。如果可能的话,您应该使用“一网打尽”技术将此查询重构为安全的查询。首先看看为什么要使用动态SQL进行此操作?@Zohar Peled我编辑了我的问题作为您问题的答案,我编辑了我的答案……首先看看为什么要使用动态SQL进行此操作?@Zohar Peled我编辑了我的问题作为对您问题的回答,我已经编辑了我的答案…必须声明标量变量@result。当我声明:将varchar值“SELECT”转换为数据类型int时,转换失败。我不太确定这是如何工作的。或者,我将@result和@value0错放在exec语句中。编辑了我的答案。如果我有value0=sum,value1=sum,value2=sum,value3=sum。。等等,我必须为它们中的每一个设置不同的ParmDefinition?不,你将它们连接起来:SET@ParmDefinition=N'@value0 int-output,@value1 int-output,@value3 int-output“…必须声明标量变量@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'。。。
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;