Vấn đề là với chức năng phân chia của bạn. Nó đang thực hiện phân tách trong RBAR thời trang. Bạn nên sử dụng bộ chia dựa trên bộ. Đây là DelimitedSplit8k của Jeff Moden, là một trong những bộ tách nhanh nhất hiện có:
CREATE FUNCTION [dbo].[DelimitedSplit8K](
@pString VARCHAR(8000), @pDelimiter CHAR(1)
)
RETURNS TABLE WITH SCHEMABINDING AS
RETURN
WITH E1(N) AS (
SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL
SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1
)
,E2(N) AS (SELECT 1 FROM E1 a, E1 b)
,E4(N) AS (SELECT 1 FROM E2 a, E2 b)
,cteTally(N) AS(
SELECT TOP (ISNULL(DATALENGTH(@pString), 0)) ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) FROM E4
)
,cteStart(N1) AS(
SELECT 1 UNION ALL
SELECT t.N+1 FROM cteTally t WHERE SUBSTRING(@pString, t.N, 1) = @pDelimiter
),
cteLen(N1, L1) AS(
SELECT
s.N1,
ISNULL(NULLIF(CHARINDEX(@pDelimiter, @pString, s.N1),0) - s.N1, 8000)
FROM cteStart s
)
SELECT
ItemNumber = ROW_NUMBER() OVER(ORDER BY l.N1),
Item = SUBSTRING(@pString, l.N1, l.L1)
FROM cteLen l
Lưu ý:Hãy nhớ xem bài viết để biết chức năng được cập nhật
Để biết thêm các chức năng phân chia, hãy đọc các bài viết này của Sir Aaron Bertrand:
- Tách chuỗi đúng cách - hoặc cách tốt nhất tiếp theo cách
- Chuỗi phân tách:Theo dõi
- Tách chuỗi:Giờ đây với ít T-SQL hơn
- So sánh các phương pháp tách / nối chuỗi
- Xử lý danh sách các số nguyên:cách tiếp cận của tôi
- Tách danh sách các số nguyên:một đợt khác
- Thông tin thêm về phân tách danh sách:dấu phân cách tùy chỉnh, ngăn trùng lặp và duy trì trật tự
- Xóa Bản sao khỏi Chuỗi trong Máy chủ SQL