Như đã nhận xét trước đó, đó là do bạn đã đạt đến số hàng sys.columns . Đây là một cách khác để tạo danh sách các số hoặc những gì người khác gọi là Numbers Table hoặc Tally Table .
Điều này sử dụng CTE được xếp tầng s và được cho là cách nhanh nhất để tạo Bảng thống kê:
DECLARE @Range AS INT = 7374
;WITH E1(N) AS( -- 10 ^ 1 = 10 rows
SELECT 1 FROM(VALUES (1),(1),(1),(1),(1),(1),(1),(1),(1),(1))t(N)
),
E2(N) AS(SELECT 1 FROM E1 a CROSS JOIN E1 b), -- 10 ^ 2 = 100 rows
E4(N) AS(SELECT 1 FROM E2 a CROSS JOIN E2 b), -- 10 ^ 4 = 10,000 rows
E8(N) AS(SELECT 1 FROM E4 a CROSS JOIN E4 b), -- 10 ^ 8 = 10,000,000 rows
CteTally(N) AS(
SELECT TOP(@Range) ROW_NUMBER() OVER(ORDER BY(SELECT NULL))
FROM E8
)
SELECT * FROM CteTally
Bạn có thể dễ dàng thêm một CTE khác nếu bạn cần nhiều hơn 10.000 hàng.
Để biết thêm thông tin về Bảng Tally, hãy đọc bài viết tuyệt vời này của Jeff Moden.
Để so sánh hiệu suất giữa các cách tạo Bảng thống kê, hãy đọc điều này .
Giải thích lấy từ bài báo của Jeff:
CTE được gọi là
E1(như trong 10E1 cho ký hiệu khoa học) không có gì nhiều hơn mườiSELECT 1được trả về dưới dạng một tập kết quả duy nhất.
E2thực hiện mộtCROSS JOINtrong tổng sốE1với chính nó. Điều đó trả về một tập hợp kết quả duy nhất gồm 10 * 10 hoặc tối đa 100 hàng. Tôi nói "tối đa" bởi vì nếu hàmTOP là 100 hoặc nhỏ hơn, CTE đủ "thông minh" để biết rằng thực sự không cần phải đi xa hơn nữa vàE4vàE8đã thắng cuộc. NếuTOPcó giá trị nhỏ hơn 100, không phải tất cả 100 hàngE2có khả năng làm cho sẽ được thực hiện. Nó sẽ luôn chỉ đủ theoTOPchức năng.Bạn có thể theo dõi từ đó.
E4là mộtCROSS JOINcủaE2và sẽ tạo tối đa 100 * 100 hoặc 10.000 hàng vàE8là mộtCROSS JOINcủaE4điều này sẽ tạo ra nhiều hàng hơn hầu hết mọi người sẽ cần. Nếu bạn đã làm nhiều hơn, thì chỉ cần thêmE16dưới dạngCROSS JOINcủaE8và thay đổiFROMcuối cùng mệnh đề tớiFROM E16.Điều thực sự đáng kinh ngạc về chàng trai hư này là nó được sản xuất ZEROREADS . Hoàn toàn không, nada, nil.