Du kan skicka in den som en kommaseparerad lista, sedan använda en delad funktion och gå med mot resultaten.
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 lagrade procedur:
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
För att sedan kalla det:
EXEC dbo.doStuff @List = '1, 2, 3, ...';
Du kan se lite bakgrund, andra alternativ och prestandajämförelser här:
- Dela strängar på rätt sätt – eller det näst bästa sätt
- Dela strängar :en uppföljning
- Splitting Strings :Nu med mindre T-SQL
- Jämföra strängdelnings-/konkateneringsmetoder
- Bearbetar en lista med heltal :mitt tillvägagångssätt
- Dela upp en lista med heltal :ytterligare en sammanfattning
- Mer om att dela listor :anpassade avgränsare, förhindra dubbletter och upprätthålla ordning
- Tar bort Dubletter från strängar i SQL Server
På SQL Server 2016 eller senare bör du dock titta på STRING_SPLIT()
och STRING_AGG()
:
- Prestanda överraskningar och antaganden:STRING_SPLIT()
- STRING_SPLIT() i SQL Server 2016:Uppföljning #1
- STRING_SPLIT() i SQL Server 2016 :Uppföljning #2
- SQL Server v.Next :STRING_AGG() prestanda
- Lös gamla problem med SQL Servers nya funktioner STRING_AGG och STRING_SPLIT