Nếu hiệu suất là mối quan tâm của bạn, có UDF này đã sẵn sàng:
create function [dbo].[Numbers](@count bigint)
RETURNS TABLE RETURN
with byte (n) as (select 1 from (VALUES
(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1)
,(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1)
,(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1)
,(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1)
,(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1)
,(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1)
,(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1)
,(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1)
,(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1)
,(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1)
,(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1)
,(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1)
,(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1)
,(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1)
,(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1)
,(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1)
) x(n) )
, byte2 (n) as (select 1 from byte a, byte b)
, byte4 (n) as (select 1 from byte2 a, byte2 b)
, byte8 (n) as (select 1 from byte4 a, byte4 b)
select top(@count) n = ROW_NUMBER() over(order by n) from byte8
Rõ ràng, đệ quy chỉ CTE tạo các công trình chuỗi số, nhưng rất chậm. Ở đây chúng tôi giao dịch một số khối lượng mã cho sự gia tăng rất lớn về hiệu suất. Điều này mang lại cho tôi hơn 30 triệu con số trong 8 giây trên máy tính bị quá tải crappy của tôi. Nó có thể đi xa như bạn muốn và có thể đủ khả năng để giới hạn của bigint tối đa.
Nó sẽ không chạm vào đĩa IO trừ khi trình tối ưu hóa loại bỏ nó ra khỏi bộ nhớ (hầu như không bao giờ cho kịch bản hợp lý). Nó cũng sẽ tránh chờ đợi và deadlocks không giống như các giải pháp dựa trên bảng vật lý.
Sử dụng như thế này:
select 2 + n*5 from Numbers(100)
Bạn sẽ có thể tạo ra một cái nhìn như thế này.
Đối với những người không yêu cầu số thực tế, chỉ cần hàng, loại bỏ thứ row_number tăng tốc hai lần.
Lấy cảm hứng từ http://weblogs.sqlteam.com/jamesn/archive/2008/05/29/60612.aspx (Itzik Ben Gan được đề cập bởi S. Neumann). Phiên bản này đi kèm với một kế hoạch thực hiện đơn giản và làm cho bigints có thể, đó là về những lợi thế.
Có một số lý do để thực hiện điều này trong SQL thay vì ở cấp ứng dụng không? – Borealid
@Borealid - Thường hữu ích khi có bảng số phụ trợ trong SQL. –
@Borealid: Nếu tôi có thể tạo ra một bảng như vậy, thì tôi tin rằng tôi có thể sử dụng nó để xây dựng các truy vấn phức tạp hơn; Nếu tôi tạo ra nó trong ứng dụng, tôi nghĩ rằng tôi sẽ bị mắc kẹt với các câu lệnh SQL siêu dài với chuỗi được xây dựng trong chúng. –