Nếu bạn cần một giải pháp đặc biệt nhanh chóng cho các trường hợp phổ biến với mã tối thiểu, thì hai lớp lót CTE đệ quy này sẽ thực hiện:
DECLARE @s VARCHAR(200) = ',1,2,,3,,,4,,,,5,'
;WITH
a AS (SELECT i=-1, j=0 UNION ALL SELECT j, CHARINDEX(',', @s, j + 1) FROM a WHERE j > i),
b AS (SELECT SUBSTRING(@s, i+1, IIF(j>0, j, LEN(@s)+1)-i-1) s FROM a WHERE i >= 0)
SELECT * FROM b
Sử dụng điều này như một tuyên bố độc lập hoặc chỉ cần thêm các CTE ở trên vào bất kỳ truy vấn nào của bạn và bạn sẽ có thể tham gia bảng kết quả b
với những người khác để sử dụng trong bất kỳ biểu thức nào khác.
chỉnh sửa (bởi Shnugo)
Nếu bạn thêm một bộ đếm, bạn sẽ nhận được một chỉ mục vị trí cùng với Danh sách:
DECLARE @s VARCHAR(200) = '1,2333,344,4'
;WITH
a AS (SELECT n=0, i=-1, j=0 UNION ALL SELECT n+1, j, CHARINDEX(',', @s, j+1) FROM a WHERE j > i),
b AS (SELECT n, SUBSTRING(@s, i+1, IIF(j>0, j, LEN(@s)+1)-i-1) s FROM a WHERE i >= 0)
SELECT * FROM b;
Kết quả:
n s
1 1
2 2333
3 344
4 4