Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jsf-2/2.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 Server执行动态布尔字符串作为WHERE条件_Sql_Sql Server_Boolean_Dynamic Sql - Fatal编程技术网

SQL Server执行动态布尔字符串作为WHERE条件

SQL Server执行动态布尔字符串作为WHERE条件,sql,sql-server,boolean,dynamic-sql,Sql,Sql Server,Boolean,Dynamic Sql,我有一个布尔表达式作为字符串存储在我的一个表中,并希望将其作为显示该记录的条件 表: 答案\u CFG=[答案\u Id],[任务\u Id],[条件] 例: “选择findAns1,1作为AnsID 4”存储在“条件”列中 findAnsa,b是我创建的一个udf,返回int DECLARE @sqlCommand nvarchar(MAX) DECLARE @cond nvarchar(MAX) SELECT @sqlCommand= 'SELECT Answer_ID FROM Ans

我有一个布尔表达式作为字符串存储在我的一个表中,并希望将其作为显示该记录的条件

表: 答案\u CFG=[答案\u Id],[任务\u Id],[条件]

例:

“选择findAns1,1作为AnsID 4”存储在“条件”列中

findAnsa,b是我创建的一个udf,返回int

DECLARE @sqlCommand nvarchar(MAX)
DECLARE @cond nvarchar(MAX)


SELECT @sqlCommand= 'SELECT Answer_ID FROM Answer_CFG as ans1 WHERE ans1.Quest_ID=@QuestionID AND (SELECT Condition from Answer_CFG as ans2 WHERE ans2.answer_ID=ans1=Answer_ID)' 

SET @sqlCommand = REPLACE(@sqlCommand, '@QuestionID', @QuestionID)


EXEC (@sqlCommand)

现在它甚至不会执行我存储在其中的udf,但即使这样,我也尝试自己执行该语句,它会执行udf,但在尝试比较时会抛出错误,“您需要使用表中存储的条件构建构成固定部分的最终查询。代码中的问题是,它只是从表中直接选择,而不是编写任何语句。尽管人们普遍认为这是一种不好的做法,但完全可以做你想做的事情。您需要分两步执行,首先检索条件,然后在最终查询中合并条件:

DECLARE @sqlCommand NVARCHAR(MAX) ;
DECLARE @cond NVARCHAR(MAX) ;
DECLARE @Id INT = 1 ;   --Replace with the actual ID you want

--Get the condition string from table
SELECT @cond = Condition FROM Answer_CFG WHERE answer_ID=@Id ;

--Build the final query by concatenating the initial, fixed part with the condition extracted
SET @SqlCommand = 'SELECT Answer_ID FROM Answer_CFG as ans1 WHERE ans1.Quest_ID=@QuestionID AND ' + @cond ;

EXEC sp_executesql @sqlCommand,'@QuestionID INT', @QuestionID ;
编辑

似乎还有一个额外的问题,那就是每一行需要获得不同的条件,所以我写的方法并不是那么容易。问题是我们不能使用完全相同的查询,但每行都需要一个不同的查询。这是最终应该执行的代码:

SELECT Answer_ID FROM Answer_CFG as ans1 WHERE ans1.Quest_ID=@QuestionID AND 1=1;
SELECT Answer_ID FROM Answer_CFG as ans1 WHERE ans1.Quest_ID=@QuestionID AND answ_id=38;
SELECT Answer_ID FROM Answer_CFG as ans1 WHERE ans1.Quest_ID=@QuestionID AND something>otherthing;
最后的条件总是不同的。假设这是可以的,并且我很好地回答了这个问题,请尝试以下方法:

DECLARE @SqlCommand NVARCHAR(MAX) = '' ;

--Compose a SQL query for each row
SELECT @SqlCommand = @SqlCommand + 'SELECT Answer_ID FROM Answer_CFG as ans1 WHERE ans1.Quest_ID=@QuestionID AND ' + Condition + ';' + CHAR(13) + CHAR(10)FROM Answer_CFG ;

--See what actually gets executed
PRINT @sqlcommand ;

--Execute the multitude of SELECTs all at once
EXEC sp_executesql @sqlCommand,N'@QuestionID INT', @QuestionID ;
这样做的问题是,它为表中的每一行发出一个查询,导致每查询一行产生一个结果集。通过在它生成的查询字符串中添加一个UNION ALL,这很容易解决,具体取决于您的需要。

您必须将[condition]值拉到某个@variable中,然后通过添加它来构造@sqlCommand,如

select @sqlCommand='select ...whatever you want... where '+@variable
你必须100%地知道,没有人会像1=1的学生一样添加条件

*另外,您不需要使用REPLACE,最好使用sp_executesql,它可以向查询传递参数:

exec sp_executesql @sqlCommand,'@QuestionID int', @QuestionID

谢谢是的,我不允许任何人设置条件lol。我想将它们分割成单独的部分似乎更符合逻辑,但我无法/仍然无法想出一种方法来为主select语句的每一行找到条件。是否需要一次为所有行应用条件?在这种情况下,我认为您需要使用一个游标作为问题ID和一个循环。但是它不会很快,如果你有10公里的行并且需要经常运行它,你可能会遇到性能问题。这是一个下拉列表,其中列出了特定问题的可能答案。因此,当下拉列表被填充时,条件会检查给定问题的答案getAns函数,并启用/禁用答案。我如何将该ID与AnswerID连接起来,以便它对每一行执行?嗯,我想我知道你在做什么,但你说的是循环,执行,并加入生成的sql语句?char13,char10指的是什么?如果我没有说清楚,很抱歉,但是条件语句与答案ID来自同一个表/记录。理论上,我认为我可以做一些类似于从answer\u CFG中选择answer\u Id、@cond=Condition,其中Quest\u Id=@questionID和@cond'No,不需要循环,第一个选择会一次生成所有指令,并将其放入@SqlCommand变量put PRINT@SqlCommand以查看其作用,然后再次运行所有指令。char 13和char 10只是为了便于调试而进行格式化,但实际上并没有做任何重要的事情。虽然使用动态SQL进行查询并不困难,但问题在于@cond不是固定的,并且随着每行的变化而变化。我无法按原样执行该行……第二行“+”、“;”有问题还有chars。如果我分别获取每行的条件,然后将该条件作为输入变量执行此过程,会更好吗?请参阅我对上一段代码的第二次编辑,我只是忽略了字符串连接顺序,犯了一个非常愚蠢的错误:P,无论如何都很难修复。您不能将条件作为输入变量来执行,因为该变量包含代码,而不仅仅是值,这就是您绝对需要动态SQL的原因。我所做的只是为所有行编写该字符串。请注意,第一个SELECT是关于简单的字符串操作和一次性运行的。