Я получил следующий код из Интернета много лет назад, и он мне очень помог.Это просто функция, которая генерирует последовательность чисел от 1 до того, что вы передаете.
По сути, это способ выполнения цикла for в инструкции SQL.
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;
Обычноработает очень хорошо и быстро, но я обнаружил, что его производительность очень низкая при использовании оператора перекрестного применения, например
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
Это очень медленно на моей машине.Кто-нибудь знает, почему он работает хорошо, когда выполняется один раз, но работает очень плохо, когда выполняется 3 раза через кросс-применить?Даже если таблица @T содержит только 1 строку, производительность по-прежнему ужасна.Есть ли лучший способ написать это?
Заранее спасибо, Майкл