В SQL Server 2008 вы можете использовать табличный параметр. Поскольку это SQL 2005, я использую список, разделенный запятыми, а затем функцию разделения, которая приводит к соответствующему типу данных и возвращает таблицу.
Я использую функцию разделения:
IF OBJECT_ID('dbo.Nums') IS NOT NULL
DROP TABLE dbo.Nums ;
GO
CREATE TABLE [dbo].[Nums]
(
[n] int NOT NULL,
PRIMARY KEY CLUSTERED ([n] ASC)
WITH (PAD_INDEX = OFF, FILLFACTOR = 100, IGNORE_DUP_KEY = OFF,
STATISTICS_NORECOMPUTE = OFF, ALLOW_ROW_LOCKS = ON,
ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
)
ON
[PRIMARY] ;
GO
DECLARE @max AS INT,
@rc AS INT ;
SET @max = 1000000 ;
SET @rc = 1 ;
INSERT INTO dbo.Nums (n)
VALUES (1) ;
WHILE @rc * 2 <= @max
BEGIN
INSERT INTO dbo.Nums (n)
SELECT n + @rc
FROM dbo.Nums ;
SET @rc = @rc * 2 ;
END
INSERT INTO dbo.Nums (n)
SELECT n + @rc
FROM dbo.Nums
WHERE n + @rc <= @max ;
GO
CREATE FUNCTION [dbo].[fn_split]
(@arr nvarchar(4000), @sep nchar(1))
RETURNS table
AS
RETURN
SELECT (n - 1) - LEN(REPLACE(LEFT(@arr, n-1), @sep, N'')) + 1 AS pos,
SUBSTRING(@arr, n, CHARINDEX(@sep, @arr + @sep, n) - n) AS element
FROM dbo.Nums
WHERE n <= LEN(@arr) + 1
AND SUBSTRING(@sep + @arr, n, 1) = @sep;
GO