Можете да го подадете като списък, разделен със запетаи, след това да използвате функция за разделяне и да обедините резултатите.
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
);
Сега вашата съхранена процедура:
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
След това, за да го извикате:
EXEC dbo.doStuff @List = '1, 2, 3, ...';
Можете да видите някои предистория, други опции и сравнения на ефективността тук:
- Разделяйте низовете по правилния начин – или следващия най-добър начин
- Разделяне на низове:Последващо действие
- Разделяне на низове:Сега с по-малко T-SQL
- Сравняване на методите за разделяне/конкатенация на низове
- Обработка на списък с цели числа:моят подход
- Разделяне на списък с цели числа:още един обзор
- Още за разделянето на списъци:персонализирани разделители, предотвратяване на дублиране и поддържане на ред
- Премахване Дубликати от низове в SQL Server
На SQL Server 2016 или по-нова версия обаче трябва да погледнете STRING_SPLIT()
и STRING_AGG()
:
- Изненади и предположения за производителност:STRING_SPLIT()
- STRING_SPLIT() в SQL Server 2016 :Последващо действие #1
- STRING_SPLIT() в SQL Server 2016 :Последващо действие #2
- SQL Server v.Next :STRING_AGG() ефективност
- Решете стари проблеми с новите функции STRING_AGG и STRING_SPLIT на SQL Server