2

私はこのような条件テーブルを持っています:

Conditions

  • ConditionID
  • MappingID
  • VariableID
  • CompareToVariableID
  • ConditionOperator(==または<>の場合があります)
  • ConjunctionOperator(&&または||の場合があります)
  • ConjunctionOrder

これで、MappingIDに応じてこれらの条件を実装したいSPができました。

MappingIDが選択されている場合、SPで何かが発生する前に、すべてのマップされた条件をチェックする必要があります。

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

たとえば、特定のテーブルにMappingID3つの行がある場合、次のようになります。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つの方法は次のとおりです(これらはストアドプロシージャの手順です)

  1. 条件をConditonsテーブルから外して、そこから特別なブール式を生成します。投稿のクエリにカーソルを合わせることで実行できます。SELECT変数 ID を変数値と混同しないように変換する必要があります (後で説明します)。クエリが返されたとしましょう:
|---------------------------------------------------------------- ----------------------------------------|
|VariableID |COMpareToVariableID |ConditionOperator |ConjunctionOperator |ConjunctionOrder|
|-----------|--------------------|---------------- --|--------------------|----------------|
|A |B |== |&& |1 |
|C |D |>> (NE) | |2 |
|-----------|--------------------|---------------- --|--------------------|----------------|

式 (ローカル SP 変数に保持) は次のようになります。

SELECT 1 WHERE #A# = #B# AND #C# >> #D#

言い換えればSELECT 1 WHERE、先頭に追加し、条件演算子==を「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 に答える