2

我有一个看起来像这样的条件表:

Conditions

  • 条件ID
  • 映射ID
  • 变量ID
  • 比较变量 ID
  • 条件运算符(可以是 == 或 <> )
  • 连接运算符(可以是 && 或 || )
  • 连词令

现在我有一个 SP,我想根据 MappingID 实现这些条件。

如果选择了 MappingID,则应在我的 SP 发生任何事情之前检查所有映射条件。

SELECT * 
FROM Conditions
WHERE MappingID = @MappingID
ORDER BY ConjunctionOrder

例如,如果某MappingID个人在表中有三行,Conditions那么:

IF VARIABLEID CONDITIONOPERATOR COMPARETOVARIABLEID CONJUNCTIONOPERATOR --row1
VARIABLEID CONDITIONOPERATOR COMPARETOVARIABLEID CONJUNCTIONOPERATOR  --row2
VARIABLEID CONDITIONOPERATOR COMPARETOVARIABLEID --row3 (ignore ConjunctionOperator for last row)
BEGIN
   --my code goes here
END
ELSE
BEGIN
   --my code here
END

我想知道如何实现 IF 语句。

4

2 回答 2

1

一种方法是这样的(这些是存储过程中的步骤)

  1. 将您的条件从Conditons表格中删除,并从中生成一个特殊的布尔表达式。您可以通过在帖子中的查询上使用光标来完成此操作。SELECT您应该转换您的变量 ID,以便它们不会与变量值混合(稍后您会看到我的意思)。假设您的查询返回:
|------------------------------------------------- ------------------------------------------|
|VariableID |COMpareToVariableID |ConditionOperator |ConjunctionOperator |ConjunctionOrder|
|-----------|--------------------|---- --|--------------------|----------------|
|A |B |== |&& |1 |
|C |D |>> (东北) | |2 |
|-----------|--------------------|---- --|--------------------|----------------|

您的表达式(保存在本地 SP 变量中)应该是:

选择 1 其中 #A# = #B# 和 #C# >> #D#

换句话说,您SELECT 1 WHERE在开头添加和 relpace 条件运算符==与'AND'=和连词运算符,并与 'OR'&&||

  1. 现在您对Variables表进行游标查询。在每个循环中,您将变量的名称替换为其值(即#A# 替换为A 值)。最后,您的表达式应类似于“SELECT 1 WHERE 1=2 AND 3<>3”。

  2. 您使用sp_executesql执行动态创建的查询。您可以将输出放在 OUTPUT 参数中,并IF在您的 SP 中的语句中检查它。

于 2012-11-26T15:43:58.817 回答
1

这是您想要的基本示例:

IF EXISTS (SELECT * FROM sys.tables WHERE name = '{0}') Select 1 ELSE SELECT 0

你也可以试试:

IF (SELECT ConditionID FROM Conditions)=COMPARETOVARIABLEID 
BEGIN
---Do your thing
END
GO
于 2012-11-26T15:51:43.890 回答