Du kan sende det ind som en kommasepareret liste, derefter bruge en delt funktion og slutte dig til resultaterne.
CREATE FUNCTION dbo.SplitInts
(
@List VARCHAR(MAX),
@Delimiter CHAR(1)
)
RETURNS TABLE
AS
RETURN
(
SELECT Item = CONVERT(INT, Item)
FROM
(
SELECT Item = x.i.value('(./text())[1]', 'INT')
FROM
(
SELECT [XML] = CONVERT(XML, '<i>'
+ REPLACE(@List, @Delimiter, '</i><i>')
+ '</i>').query('.')
) AS a
CROSS APPLY
[XML].nodes('i') AS x(i)
) AS y
WHERE Item IS NOT NULL
);
Nu din lagrede procedure:
CREATE PROCEDURE dbo.doStuff
@List VARCHAR(MAX)
AS
BEGIN
SET NOCOUNT ON;
SELECT cols FROM dbo.table AS t
INNER JOIN dbo.SplitInts(@List, ',') AS list
ON t.ID = list.Item;
END
GO
Så for at kalde det:
EXEC dbo.doStuff @List = '1, 2, 3, ...';
Du kan se nogle baggrunde, andre muligheder og præstationssammenligninger her:
- Opdel strenge på den rigtige måde – eller den næstbedste måde
- Opdeling af strenge:En opfølgning
- Splitting Strings :Nu med mindre T-SQL
- Sammenligning af strengopdelings-/sammenkædningsmetoder
- Behandling af en liste over heltal:min tilgang
- Opdeling af en liste over heltal:endnu en roundup
- Mere om opdeling af lister :tilpassede afgrænsninger, forebyggelse af dubletter og opretholdelse af rækkefølge
- Fjerner Dubletter fra strenge i SQL Server
På SQL Server 2016 eller nyere bør du dog se på STRING_SPLIT()
og STRING_AGG()
:
- Ydeevne overraskelser og antagelser:STRING_SPLIT()
- STRING_SPLIT() i SQL Server 2016:Opfølgning #1
- STRING_SPLIT() i SQL Server 2016:Opfølgning #2
- SQL Server v.Next :STRING_AGG() ydeevne
- Løs gamle problemer med SQL Servers nye STRING_AGG- og STRING_SPLIT-funktioner