Chà, bạn luôn có thể sử dụng REPLACE
để thêm một dấu phân cách một ký tự vào đối số trước khi chuyển nó vào. Bạn chỉ cần chọn một ký tự không có khả năng / không thể xuất hiện trong dữ liệu thực tế. Trong ví dụ này, giả sử dữ liệu gốc của bạn sử dụng ba đường ống làm dấu phân cách; Tôi đã chọn một ký tự Unicode ngẫu nhiên để thay thế:
DECLARE
@olddelim nvarchar(32) = N'|||',
@newdelim nchar(1) = NCHAR(9999); -- pencil (✏)
DECLARE @x nvarchar(max) = N'foo|||bar|||blat|||splunge';
SELECT * FROM STRING_SPLIT(REPLACE(@x, @olddelim, @newdelim), @newdelim);
Tôi viết blog về điều này chi tiết hơn ở đây:
Giải quyết một bình luận:
giải pháp xấu. Điều gì xảy ra nếu chuỗi gốc giống như 'abc | | pqr ||| rst | | 123' (động và có thể chứa bất cứ thứ gì). o / p mong muốn là 'abc | | pqr' và 'rst || 123' nhưng giải pháp của bạn sẽ cho 'abc' 'pqr' 'rst' '123'
Được rồi, hãy lấy đầu vào của bạn và xem liệu giải pháp của tôi có đầu ra sai.
DECLARE
@olddelim nvarchar(32) = N'|||',
@newdelim nchar(1) = NCHAR(9999); -- pencil (✏)
DECLARE @x nvarchar(max) = N'abc||pqr|||rst||123';
SELECT * FROM STRING_SPLIT(REPLACE(@x, @olddelim, @newdelim), @newdelim);
Kết quả là:
abc||pqr
rst||123
Và không phải những gì bạn phải giả định (nhưng không kiểm tra) này:
abc
pqr
rst
123
Nếu dữ liệu của bạn nằm trong một bảng, bạn có thể tạo chế độ xem để bạn không phải đưa yếu tố biểu hiện đó vào tất cả các truy vấn của mình.
Nếu điều đó không hiệu quả, vì bạn có thể có một cây bút chì ( ✏
) trong dữ liệu của mình và bạn không thể tìm thấy một ký tự trong 1.11,998 ký tự Unicode có sẵn không có trong bộ dữ liệu của bạn, bạn sẽ phải bỏ qua STRING_SPLIT()
, vì nó được mã hóa cứng để chấp nhận một ký tự phân cách ký tự ( separator
Is a single character expression
).
Các lựa chọn thay thế đã được trả lời ở đây hàng chục lần trước đây , nhiều lần trước khi STRING_SPLIT()
tồn tại. Những phương pháp đó vẫn hoạt động.
Tôi đi qua nhiều lựa chọn thay thế và cũng thảo luận về những hạn chế trong STRING_SPLIT()
loạt bài này (tôi cũng thảo luận về lý do tại sao bạn có thể cân nhắc không làm điều này trong T-SQL bằng bất kỳ phương thức nào):