Ik weet dat dit niet de eigenlijke vraag beantwoordt, maar alle oplossingen die ik heb gezien om dit aan te pakken, voelen als een vuile hack om de eerdere beperkingen van het niet kunnen doorgeven van meerdere waarden aan een procedure te omzeilen. Sinds de introductie van tabelwaardeparameters in sql-server 2008 zie ik geen reden waarom een gescheiden string nodig zou zijn binnen SQL:
De eerste stap is om uw type te maken dat de waarden bevat (ik gebruik meestal generieke namen zodat ze opnieuw kunnen worden gebruikt):
CREATE TYPE dbo.StringList AS TABLE (Value NVARCHAR(MAX));
Maak vervolgens uw procedure:
CREATE PROCEDURE dbo.GetFromTable @OrgList dbo.StringList READONLY
AS
SELECT Something
FROM MyTable
WHERE Org + '-' + OrgSub IN (SELECT Value FROM @OrgList);
GO
Dan kunt u uw procedure als volgt oproepen
DECLARE @OrgList dbo.StringList;
INSERT @OrgList VALUES
('2342342', '________', 'A'),
('5435354', '________', 'B');
EXECUTE dbo.GetFromTable @OrgList;
Dit zou zelfs de mogelijkheid bieden om een meer geschikte tafel te maken:
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
Om vervolgens uit te voeren
DECLARE @OrgList dbo.OrgList;
INSERT @OrgList VALUES
('2342342', '________'),
('5435354', '________');
EXECUTE dbo.GetFromTable @OrgList;
Als het absoluut noodzakelijk is om een door komma's gescheiden lijst door te geven, kunt u deze converteren naar het StringList Type met behulp van XML-conversie, en dezelfde procedure gebruiken, maar het gebruik van een tabelwaardeparameter zorgt voor veel meer flexibiliteit dan het gebruik van een gescheiden string:
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