0

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

表:Answer_CFG = [answer_Id]、[Quest_ID]、[条件]

前任:

'(SELECT findAns(1,1) as AnsID) <> 4' 存储在'condition' 列中

(findAns(a,b) 是我制作的一个返回 int 的 udf)

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,但在尝试比较时会抛出错误('<>','<=' ETC....)

让我知道这是否可能。我想尝试一些聪明的东西,但在这一点上它可能只是一个放弃的努力。

这与 asp.net/C# 相关联,用于条件下拉菜单。我宁愿不必硬编码一堆 if 语句。

谢谢

4

2 回答 2

1

您必须将[condition]价值拉到一些@variable,然后通过添加它来构造您的@sqlCommand,例如

select @sqlCommand='select ...whatever you want... where '+@variable

而且您必须 100% 知道没有人会添加类似的条件1=1 drop table students;)

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

exec sp_executesql @sqlCommand,'@QuestionID int', @QuestionID
于 2013-07-28T21:29:26.130 回答
0

您需要使用存储在表中的条件构建组成固定部分的最终查询。您的代码中的问题是它只是从表中选择,而不是组成任何语句。完全有可能做你想做的事(即使它被广泛认为是一种不好的做法)。您需要分两步完成,首先检索条件,然后将其合并到最终查询中:

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 来解决,具体取决于您的需要。

于 2013-07-28T21:26:02.217 回答