Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/67.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/5/ember.js/4.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
Sql 在存储过程中将查询作为参数传递_Sql_Sql Server - Fatal编程技术网

Sql 在存储过程中将查询作为参数传递

Sql 在存储过程中将查询作为参数传递,sql,sql-server,Sql,Sql Server,我有一个存储过程,它接受nvarchar,但它将作为查询的一部分,如下所示: Input Parameter @InputQuery = '21 OR RevenueAccrualID = 22' 我想将输入查询添加到现有查询中: UPDATE [RevenueAccrual] SET Posted=1 Where [RevenueAccrual].RevenueAccrualID = @InputQueryPart 我想要的输出是: UPDATE [RevenueAccrual] S

我有一个存储过程,它接受
nvarchar
,但它将作为查询的一部分,如下所示:

Input Parameter @InputQuery =  '21 OR RevenueAccrualID =  22'
我想将输入查询添加到现有查询中:

UPDATE [RevenueAccrual] SET Posted=1
 Where [RevenueAccrual].RevenueAccrualID = @InputQueryPart
我想要的输出是:

UPDATE [RevenueAccrual] SET Posted=1
Where [RevenueAccrual].RevenueAccrualID = 21
OR RevenueAccrualID =  22
它目前所做的是:

 UPDATE [RevenueAccrual] SET Posted=1
 Where [RevenueAccrual].RevenueAccrualID = '21 OR RevenueAccrualID =  22' 

我想知道是否有方法将查询作为参数传递并在SQL Server中使用它。输入查询将根据情况而有所不同

您需要将整个查询封装在字符串中-因此,如果您要将@InputQuery传递到存储过程中,那么它应该如下所示:

DECLARE @QueryString NVARCHAR(500)

SET @QueryString = 'UPDATE [RevenueAccrual] SET Posted=1 Where [RevenueAccrual].RevenueAccrualID = '
SET @QueryString = @QueryString + @InputQuery
EXEC (@QueryString)
CREATE PROCEDURE RunThisThang (@InputStr)
AS

DECLARE @QUeryStr NVARCHAR(500)

SET @QueryStr = 'UPDATE [RevenueAccrual] SET Posted=1 Where [RevenueAccrual].RevenueAccrualID IN (' + @InputStr + ')'
EXEC (@QueryStr)
所以它可以一次执行整个过程。但是,如果在同一个字段中使用in时始终是整数值,我可能会改变这种方法

DECLARE @InputQuery NVARCHAR(30)
SET @InputQuery = '21, 22'
EXEC RunThisThang(@InputQuery)
然后,您的存储过程如下所示:

DECLARE @QueryString NVARCHAR(500)

SET @QueryString = 'UPDATE [RevenueAccrual] SET Posted=1 Where [RevenueAccrual].RevenueAccrualID = '
SET @QueryString = @QueryString + @InputQuery
EXEC (@QueryString)
CREATE PROCEDURE RunThisThang (@InputStr)
AS

DECLARE @QUeryStr NVARCHAR(500)

SET @QueryStr = 'UPDATE [RevenueAccrual] SET Posted=1 Where [RevenueAccrual].RevenueAccrualID IN (' + @InputStr + ')'
EXEC (@QueryStr)

为什么要将查询作为参数传递。这是一种非常糟糕的编程方式。只需传递变量,并将查询写入sp即可


将查询传递给sp不是一种优化的方式。

在存储过程中,您需要将sql创建为字符串,然后将限制连接到末尾并执行该字符串。或者,如果您不确定参数的数量,请在中使用
子句。类似于
Where[RevenueAccrual].RevenueAccrualID IN(21,22)
创建存储过程后,您是否运行了类似EXEC RunThisThang('21,22')的操作?虽然这回答了问题,但我强烈建议不要使用这种方法。动态sql查询容易受到sql注入攻击,如果可能的话,应该避免。完全同意Zohar的观点-这不是理想的解决方案,应该被认为是一种黑客解决方案,直到可以做得更好(更持久)。这个查询没有那么危险,但它可能会导致黑暗的一面:抛出整个查询字符串!我们正在使用一个有限制的软件,所以我们必须做这些“黑客”使其工作