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.
E2
thực hiện mộtCROSS JOIN
trong tổng sốE1
vớ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àE4
vàE8
đã thắng cuộc. NếuTOP
có giá trị nhỏ hơn 100, không phải tất cả 100 hàngE2
có khả năng làm cho sẽ được thực hiện. Nó sẽ luôn chỉ đủ theoTOP
chức năng.Bạn có thể theo dõi từ đó.
E4
là mộtCROSS JOIN
củaE2
và sẽ tạo tối đa 100 * 100 hoặc 10.000 hàng vàE8
là mộtCROSS JOIN
củ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êmE16
dưới dạngCROSS JOIN
củaE8
và thay đổiFROM
cuố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.