このような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のオプションが行く方法だと思う。
期待している出力がわかりません。あなたはあなたのテーブルから返すと予想されるデータの例を教えてください。 –
@Abe Miessler:投稿を編集しました! – Cipher