我如何解析布尔逻辑字符串?

时间:2010-04-09 21:21:40

标签: sql-server-2005 parsing

这听起来很疯狂,但是有没有人能够让我在SQL Server 2005中解析布尔逻辑字符串而不需要非常/荒谬的努力?

以下是一个例子:

(SOMEVAR=4 OR SOMEVAR=5) AND (NOT OTHERVAR=Y)

如果在SQL中可能的话,我觉得递归会有很大的帮助,但我不确定如何去做那种事情。如果没有,也许有一种方法可以附加一个外部系统来为我做递归。别担心,我没有抱怨。

3 个答案:

答案 0 :(得分:1)

最好的办法是使用CLR integration。这将使查找或开发能够解决此问题的代码变得更加容易。

答案 1 :(得分:0)

如果从某个进程(网站或其他)接收逻辑字符串作为输入,则可以使用它们来构建和执行动态sql字符串。你必须非常小心这种接近的注射攻击。

答案 2 :(得分:0)

从你的评论判断你需要知道'最终发现最外层的陈述是真还是假'然后你不需要解析表达式,你需要对它进行评估。您可以尝试使用sp_executesql:

...
declare @sql nvarchar(max);
declare @result bit;
-- consider @expression has the expression to be evaluated
-- eg. @expression = '(@SOMEVAR=4 OR @SOMEVAR=5) AND (NOT @OTHERVAR=''Y'')';
set @sql = N'set @result=case when ' + @expression + N' then 1 else 0 end;';
exec sp_executesql @sql, N'@SOMEVAR int, @OTHERVAR vachar(max), @result bit output', @SOMEVAR, @OTHERVAR, @result output;
SELECT @result;
...

虽然这可以满足您的需求(评估表达式),但它存在重大问题:

  • 它对SQL注入开放,@表达必须是可信输入
  • @expression只能引用在sp_executesql
  • 期间传入的局部变量
  • 您需要将所有局部变量传递给sp_executesql,或至少传递给@expression
  • 的所有局部变量
  • 很难维护,因为任何新的局部变量都必须传递给sp_executesql(两者都声明为参数实际作为参数添加)
  • @expression中的任何错误都将作为执行错误传播(你可以包含在BEGIN TRY / BEGIN CATCH中以防止这种情况发生)

我不知道您的具体情况,但请考虑是否有必要进行评估。我不是说完全没有,因为我自己必须处理类似的问题(来自需要评估的配置表的表达式)。