Możesz przekazać ją jako listę oddzieloną przecinkami, a następnie użyć funkcji dzielenia i połączyć z wynikami.
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
);
Teraz Twoja procedura składowana:
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
Następnie nazwij to:
EXEC dbo.doStuff @List = '1, 2, 3, ...';
Tutaj możesz zobaczyć tło, inne opcje i porównania wydajności:
- Podziel ciągi we właściwy sposób – lub następny najlepszy sposób
- Podział ciągów:kontynuacja
- Dzielenie ciągów:teraz z mniejszą ilością T-SQL
- Porównywanie metod dzielenia/konkatenacji ciągów
- Przetwarzanie listy liczb całkowitych:moje podejście
- Dzielenie listy liczb całkowitych:kolejna obława
- Więcej o dzieleniu list:niestandardowe ograniczniki, zapobieganie duplikatom i utrzymywanie porządku
- Usuwanie Duplikaty z ciągów w SQL Server
Jednak w przypadku SQL Server 2016 lub nowszego należy spojrzeć na STRING_SPLIT()
i STRING_AGG()
:
- Niespodzianki i założenia dotyczące wydajności:STRING_SPLIT()
- STRING_SPLIT() w SQL Server 2016 :Kontynuacja #1
- STRING_SPLIT() w SQL Server 2016 :Kontynuacja nr 2
- SQL Server v.Next :Wydajność STRING_AGG()
- Rozwiąż stare problemy za pomocą nowych funkcji STRING_AGG i STRING_SPLIT w SQL Server