Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/85.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在tsql中使用执行函数填充变量?_Sql_Sql Server_Tsql_Exec_Execution - Fatal编程技术网

如何在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;