2012-03-01 11 views
-1

からオプション項目の組み合わせを取得いくつかの結果をフェッチするために、私は、ユーザーが選択できる、そこから自分のアプリケーションでいくつかのオプション項目の組み合わせを有し、したがって、SQL Serverからの照会するDB

のユーザーが組み合わせを選択しましょう等:

Option1 - Item1 
Option1 - Item2 
Option2 - Item1 

データベーステーブル:

Option1  Item1  Details1 Details2 Details3 
Option1  Item2  Details4 Details5 Details6 
Option1  Item3  Details7 Details8 Details9 
Option1  Item4  Details10 Details11 Details12 
... 
Option2  Item1  Details13 Details14 Details15 

、上記オプション項目の組み合わせを選択することで、それに対応する詳細が取得されます。

クエリのOption-Itemの組み合わせを渡してこれらの詳細を取得するにはどうすればよいですか? は、私のような何かを試してみました:

SELECT * FROM tbData 
    WHERE Strategy IN ('Option1','Option2') 
    AND Items IN ('Item1','Item2') 

を...しかし、これは間違った答えを与えます。

+0

期待している出力がわかりません。あなたはあなたのテーブルから返すと予想されるデータの例を教えてください。 –

+0

@Abe Miessler:投稿を編集しました! – Cipher

答えて

0

このようなINは使用できません。あなたが言う必要があります。

WHERE (Strategy = 'Option1' AND Items IN ('Item1', 'Item2')) 
OR (Strategy = 'Option2' AND Items IN ('Item1')) 

各列のINは別途「戦略は(オプション1またはオプション2)の任意の値である任意の行を返すこと、およびアイテムは(項目1または項目の任意の値であるためです2)。 "これらの2つの概念を別々に適用することはできず、SQL ServerはItem2がOption1にのみ適用されることを認識します。


もう1つのオプションは、テーブル値のパラメータを使用することです。次のようにだから、SQL Serverでテーブルタイプを定義することができます。

CREATE TYPE dbo.Options AS TABLE 
(
    Strategy VARCHAR(32), 
    Items VARCHAR(32) 
); 

は、その後にそれを渡し、選択したオプションでC#でのDataTableに移入あなたのクエリは次のようになります。

CREATE PROCEDURE dbo.whatever 
    @tvp dbo.Options READONLY 
AS 
BEGIN 
    SELECT d.* FROM tbData AS d 
     INNER JOIN @tvp AS t 
     ON d.Strategy = t.Strategy 
     AND d.Items = t.Items; 
END 
GO 

さらに別のオプションを追加してを編集してください。

オプションをテーブルにデュアル区切り文字列として渡すことができます。

@Options = 'Option1,Item1;Option1,Item2;Option2,Item1' 

次に、テーブル値関数などを使用できます。

CREATE FUNCTION dbo.SplitMultiStrings 
(
    @List VARCHAR(MAX), 
    @d1 CHAR(1), 
    @d2 CHAR(1) 
) 
RETURNS TABLE 
AS 
    RETURN 
    (
    SELECT x, y FROM 
    (
     SELECT 
     x = i.i.value('(./x/text())[1]', 'varchar(32)'), 
     y = i.i.value('(./y/text())[1]', 'varchar(32)') 
     FROM (
     SELECT [XML] = CONVERT(XML, '<i><x>' 
      + REPLACE(REPLACE(@List, @d1, '</x><y>'), 
      @d2, '</y></i><i><x>') + '</y></i>') 
    ) AS x CROSS APPLY [XML].nodes('i') AS i(i) 
    ) AS y WHERE x IS NOT NULL AND y IS NOT NULL 
); 
GO 

だから今、あなたが言うことができます。その後、

CREATE PROCEDURE dbo.whatever 
    @Options VARCHAR(MAX) 
AS 
BEGIN 
    SET NOCOUNT ON; 

    BEGIN TRY 
    SELECT d.* 
     FROM dbo.SplitMultiStrings(@List, ',', ';') AS o 
     INNER JOIN tbData AS d 
     ON o.x = d.Strategy AND o.y = d.Items; 
    END TRY 
    BEGIN CATCH 
    RAISERROR('You probably have a trailing ; or other formatting issue.', 11, 1); 
    END CATCH 
END 
GO 

そして、(アプリケーションからこのカンマ/セミコロンで区切られた文字列を渡すことによって)このようストアドプロシージャを呼び出す:

EXEC dbo.whatever @Options = 'Option1,Item1;Option1,Item2;Option2,Item1'; 

しかし、私はまだTVPのオプションが行く方法だと思う。

+0

これは、この特定のクエリに対して静的なものです。私の目的のために、@ Option = 'Option1'、 'Option2'、@ Items = 'Items1'、 'Items2'をアプリケーションから渡す必要があります。 – Cipher

+0

はい、私はそれを知っています。それが私がテーブル値のパラメータを提案した理由です。アプリケーションでDataTableを作成すると、文字列ではなくテーブルのように渡されます。 –

+0

これは私が実際に使用しなければならないデータの凝縮された例であり、このために入るのは難しいでしょう。私はStoredPがアプリケーションを通して生成された文字列を渡すことができるいくつかの方法を提案することができます – Cipher

関連する問題