多年前,我从网上获取了下面的代码,它一直为我服务得很好。它只是一个生成从1到您传递进来的任意数字序列的函数。
基本上这是在SQL语句中使用for循环的一种方法。
CREATE FUNCTION [SequenceCreate]
(@MaxValue INT)
RETURNS TABLE
AS
RETURN
WITH
Num1 (n) AS (SELECT 1 UNION ALL SELECT 1),
Num2 (n) AS (SELECT 1 FROM Num1 AS X, Num1 AS Y),
Num3 (n) AS (SELECT 1 FROM Num2 AS X, Num2 AS Y),
Num4 (n) AS (SELECT 1 FROM Num3 AS X, Num3 AS Y),
Num5 (n) AS (SELECT 1 FROM Num4 AS X, Num4 AS Y),
Num6 (n) AS (SELECT 1 FROM Num5 AS X, Num5 AS Y),
Nums (n) AS
(SELECT ROW_NUMBER() OVER(ORDER BY n)
FROM Num6)
SELECT n AS [Value] FROM Nums
WHERE n BETWEEN 1 AND @MaxValue;
通常情况下,这个方法运行得非常良好且速度快,但我发现在使用 CROSS APPLY 语句时其性能非常差,例如:
DECLARE @T TABLE(StartNum INT, ItemCount INT)
INSERT INTO @T VALUES (100, 5)
INSERT INTO @T VALUES (110, 7)
INSERT INTO @T VALUES (55, 3)
SELECT Seq.Value + StartNum FROM @T
CROSS APPLY he.SequenceCreate(ItemCount) AS Seq
这在我的机器上非常缓慢。有人知道为什么执行一次时它运行良好,但通过CROSS APPLY执行三次时运行非常糟糕吗?即使@T表只包含1行,性能仍然很差。有更好的方法来编写吗?
提前感谢, Michael