Potresti passarlo come un elenco separato da virgole, quindi utilizzare una funzione di divisione e unirti ai risultati.
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
);
Ora la tua procedura memorizzata:
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
Quindi per chiamarlo:
EXEC dbo.doStuff @List = '1, 2, 3, ...';
Puoi vedere alcuni background, altre opzioni e confronti delle prestazioni qui:
- Dividi le stringhe nel modo giusto o nel migliore dei modi modo
- Splitting stringhe:un seguito
- Dividere le stringhe:ora con meno T-SQL
- Confronto dei metodi di divisione/concatenazione delle stringhe
- Elaborazione di un elenco di numeri interi:il mio approccio
- Suddivisione di un elenco di numeri interi:un'altra carrellata
- Ulteriori informazioni sulla suddivisione degli elenchi:delimitatori personalizzati, prevenzione dei duplicati e mantenimento dell'ordine
- Rimozione Duplicati da stringhe in SQL Server
In SQL Server 2016 o versioni successive, tuttavia, dovresti esaminare STRING_SPLIT()
e STRING_AGG()
:
- Sorprese e ipotesi di prestazioni:STRING_SPLIT()
- STRING_SPLIT() in SQL Server 2016:follow-up n. 1
- STRING_SPLIT() in SQL Server 2016:follow-up n. 2
- SQL Server v.Next :Prestazioni di STRING_AGG()
- Risolvi vecchi problemi con le nuove funzioni STRING_AGG e STRING_SPLIT di SQL Server