hãy thử cái này:
create table #smalltable (id int, [begin] int, [end] int)
insert into #smalltable values (123,1,4)
insert into #smalltable values (124,1,12)
insert into #smalltable values (125,1,7)
;WITH digits (d) AS (
SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION
SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION
SELECT 7 UNION SELECT 8 UNION SELECT 9 UNION
SELECT 0)
SELECT
s.id, s.[begin], n.Number AS [End]
FROM (SELECT i.d + ii.d * 10 + iii.d * 100 + iv.d * 1000 +
v.d * 10000 + vi.d * 100000 AS Number
FROM digits i
CROSS JOIN digits ii
CROSS JOIN digits iii
CROSS JOIN digits iv
CROSS JOIN digits v
CROSS JOIN digits vi
) AS N
INNER JOIN #smalltable s ON 1=1
INNER JOIN (SELECT MAX([end]) AS MaxEnd FROM #smalltable) dt ON 1=1
WHERE n.Number > 0 AND n.Number<=dt.MaxEnd
AND n.Number<=s.[end]
ORDER BY s.id,n.Number
nhận xét
- không đặt tên cho các cột của bạn bằng các từ dành riêng:"bắt đầu" và "kết thúc", bạn sẽ cảm ơn tôi vào một ngày nào đó.
- nếu bạn định chạy quá trình sản xuất nhiều lần, hãy tạo một bảng số
và sử dụng truy vấn này thay thế:
phải có một bảng Số trước khi điều này hoạt động (xem liên kết ở trên)
SELECT
s.id,s.[begin],n.Number AS [End]
FROM Numbers n
INNER JOIN #smalltable s ON 1=1
WHERE n.Number > 0 AND n.Number<=s.[end]
ORDER BY s.id,number
nó sẽ chạy tốt hơn.