РЕДАКТИРОВАТЬ: Пример ниже
Как уже упоминалось @Oded, лучше всего использовать табличные параметры.
Однако, если по какой-либо причине вы не можете использовать эти(возможно, ограничения вашей структуры вызовов), вы можете использовать следующее для выполнения разделения на таблицу:
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER FUNCTION [dbo].[SplitToTable]
(
@List varchar(max), @Delim varchar(1)
)
RETURNS TABLE
AS
RETURN
(
WITH csvtbl(Start, [Stop]) AS (
SELECT Start = convert(bigint, 1), [Stop] =
charindex(@Delim COLLATE Slovenian_BIN2, @list + @Delim)
UNION ALL
SELECT Start = [Stop] + 1, [Stop] = charindex(@Delim
COLLATE Slovenian_BIN2, @list + @Delim, [Stop] + 1)
FROM csvtbl
WHERE ([Stop] > 0)
)
SELECT substring(@list, Start, CASE WHEN [Stop] > 0 THEN [Stop] -
Start ELSE 0 END) AS Value
FROM csvtbl
WHERE ([Stop] > 0)
)
Вам необходимо знать о глубине рекурсии по умолчанию, равной 100. Если этого недостаточно, увеличьтедобавив следующее к вашему внешнему вызову:
OPTION (MAXRECURSION 1000) -- or 0 for unlimited
ПРИМЕР
SELECT *
FROM MyTable as t
WHERE t.ID IN (
SELECT *
FROM dbo.SplitToTable('1,2,12,34,101', ',')
)
Может использоваться и в соединениях и т. д.