これが実際の質問に答えていないことはわかっていますが、これを処理するために私が見たすべてのソリューションは、プロシージャに複数の値を渡すことができないという以前の制限を回避するための汚いハックのように感じます. sql-server 2008 でテーブル値パラメーターが導入されて以来、SQL 内で区切られた文字列が必要になる理由がわかりません:
最初のステップは、値を含む型を作成することです (再利用できるように一般的な名前を使用する傾向があります):
CREATE TYPE dbo.StringList AS TABLE (Value NVARCHAR(MAX));
次に、プロシージャを作成します:
CREATE PROCEDURE dbo.GetFromTable @OrgList dbo.StringList READONLY
AS
SELECT Something
FROM MyTable
WHERE Org + '-' + OrgSub IN (SELECT Value FROM @OrgList);
GO
次に、次のようにプロシージャを呼び出すことができます
DECLARE @OrgList dbo.StringList;
INSERT @OrgList VALUES
('2342342', '________', 'A'),
('5435354', '________', 'B');
EXECUTE dbo.GetFromTable @OrgList;
これにより、より適切なテーブルを作成する機会さえ与えられます:
CREATE TYPE dbo.OrgList AS TABLE(Org VARCHAR(10), OrgSub VARCHAR(10));
CREATE PROCEDURE dbo.GetFromTable @OrgList dbo.OrgList READONLY
AS
SELECT Something
FROM MyTable
WHERE EXISTS
( SELECT 1
FROM @OrgList O
WHERE MyTable.Org = o.Org
AND MyTable.OrgSub = o.OrgSub
);
GO
次に実行します
DECLARE @OrgList dbo.OrgList;
INSERT @OrgList VALUES
('2342342', '________'),
('5435354', '________');
EXECUTE dbo.GetFromTable @OrgList;
コンマ区切りリストを渡す必要がある場合は、XML 変換を使用して StringList タイプに変換し、同じ手順を使用できますが、テーブル値パラメーターを使用すると、区切り文字列を使用するよりもはるかに柔軟になります。
DECLARE @S VARCHAR(MAX) = '2342342-________,5435354-________,_______-________';
DECLARE @OrgList dbo.StringList;
INSERT @OrgList
SELECT Y.value('.', 'NVARCHAR(MAX)')
FROM (SELECT [X] = CAST(('<X>' + REPLACE(@S, ',' ,'</X><X>')+'</X>') AS XML)) X
CROSS APPLY X.nodes('X') AS y (Y)
EXECUTE GetFromTable @OrgList