0

ユーザーが検索条件を動的に追加してレコードを除外するページがあります。これらの条件を TVP のストアド プロシージャに送信しています。ここで、「OR」ではなく「AND」として機能するこれらのフィルターを適用するクエリを作成する必要があります。

学生テーブルの例を考えてみましょう

ID          Name         Marks
----------- ---------    -------
2           bab          65
4           bad          75
6           baf          85

TVP で Stored proc の条件を取得しています (列と演算子の ID を送信していますが、わかりやすくするために、この例では列名と演算子を使用しました)

 Column     Operator    Value
----------- ---------   -------
Name        Contains    a
Marks       >=          75

ここで、この TVP を使用して学生テーブルからレコードを除外する必要があります。この例では、学生テーブルの最後の 2 行がユーザーに表示されます。

これに対するクエリの作成を手伝ってくれる人はいますか?学生テーブルと TVP の間でクロス結合を試みましたが、クエリは TVP の条件の AND ではなく OR です。

サンプルクエリ:

    DECLARE @tmpCond TABLE
(
    ColumnId SMALLINT,
    OperatorId SMALLINT,
    Value VARCHAR(10)
)

INSERT INTO @tmpCond
        ( ColumnId ,
          OperatorId ,
          Value
        )
VALUES  ( 1,1,'a')
        ,(2,2,'75')

SELECT * FROM dbo.Student A
CROSS JOIN @tmpCond B
WHERE 
    (B.ColumnId = 1 AND B.OperatorId = 1 AND A.NAME LIKE '%'+B.Value+'%')
    OR
    (B.ColumnId = 2 AND B.OperatorId = 2 AND A.Marks >= B.Value)
4

1 に答える 1

1

次のことを行う必要があります。

  1. where パラメータが欠落している string として予備クエリを作成しますquery = 'select * from student where xxx order by name, marks'xxx適切な内容に置き換えます。
  2. クエリ部分の変数を作成しますwhere_part = ''
  3. カーソルを使用して、TVP のすべての行を反復処理します
  4. column, operator, valueTVP のすべてについて、次のような文字列を作成してname + operator + value + ' and 'に追加しますwhere_part
  5. TVP からすべての行を処理した後' and '、この意味で最後の を削除します: '条件と条件と条件'。
  6. 'xxx'で置き換えqueryますwhere_part
  7. 実行しますexec(@query)(tsql、他の DB では構文が異なります)。「ストアドプロシージャの動的SQL」については、この記事とグーグルも参照してください。
于 2012-04-30T06:09:32.543 に答える