Vím, že to neodpovídá na skutečnou otázku, ale všechna řešení, která jsem viděl, aby to zvládla, mi připadají jako špinavý hack, jak obejít předchozí omezení nemožnosti předat postupu více hodnot. Od zavedení tabulkových hodnot parametrů v SQL-server 2008 nevidím žádný důvod, proč by byl v SQL potřeba oddělený řetězec:
Prvním krokem je vytvořit typ, který bude obsahovat hodnoty (mám tendenci používat obecná jména, aby je bylo možné znovu použít):
CREATE TYPE dbo.StringList AS TABLE (Value NVARCHAR(MAX));
Poté vytvořte svůj postup:
CREATE PROCEDURE dbo.GetFromTable @OrgList dbo.StringList READONLY
AS
SELECT Something
FROM MyTable
WHERE Org + '-' + OrgSub IN (SELECT Value FROM @OrgList);
GO
Poté můžete svou proceduru zavolat následovně
DECLARE @OrgList dbo.StringList;
INSERT @OrgList VALUES
('2342342', '________', 'A'),
('5435354', '________', 'B');
EXECUTE dbo.GetFromTable @OrgList;
To by dokonce umožnilo vytvořit vhodnější tabulku:
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
Poté proveďte
DECLARE @OrgList dbo.OrgList;
INSERT @OrgList VALUES
('2342342', '________'),
('5435354', '________');
EXECUTE dbo.GetFromTable @OrgList;
Pokud je absolutně nutné předat seznam oddělený čárkami, můžete jej převést na typ StringList pomocí převodu XML a použít stejný postup, ale použití parametru s hodnotou tabulky umožňuje mnohem větší flexibilitu než použití řetězce s oddělovači:
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