Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

Cách hiệu quả nhất để chia chuỗi thành các hàng

Đây là chức năng hoạt động hiệu quả nhất mà tôi có:

CREATE FUNCTION [Resource].[udf_SplitByXml]
      (@Data NVARCHAR(MAX), @Delimiter NVARCHAR(5))
RETURNS @Table TABLE 
    ( Data NVARCHAR(MAX)
    , SequentialOrder INT IDENTITY(1, 1))
AS
BEGIN

    DECLARE @TextXml XML;
    SELECT @TextXml = CAST('<d>' + REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(@Data, '&', '&amp;'), '<', '&lt;'), '>', '&gt;'), '"', '&quot;'), '''', '&apos;'), @Delimiter, '</d><d>') + '</d>' AS XML);

    INSERT INTO @Table (Data)
    SELECT Data = REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(RTRIM(LTRIM(T.split.value('.', 'nvarchar(max)'))), '&amp;', '&'), '&lt;', '<'), '&gt;', '>'), '&quot;', '"'), '&apos;', '''')
    FROM @TextXml.nodes('/d') T(Split)

    RETURN
END

Dưới đây là các cuộc gọi mẫu mà bạn có thể sử dụng để kiểm tra kết quả:

SELECT * FROM Resource.udf_SplitByXml('yes, no, maybe, so', ',');
SELECT * FROM Resource.udf_SplitByXml('who|what|where|when|why|how|Uh, I don''t know!', '|');
SELECT * FROM Resource.udf_SplitByXml('Government, Education, Non-profit|Energy & Power|Yes|No', '|');
SELECT * FROM Resource.udf_SplitByXml('Energy & Power|Some<Thing>Wicked''This"Way Comes', '|');

Một tùy chọn khác là thử giải pháp CLR dựa trên mã của Adam Machanic, người chiến thắng trong bài kiểm tra hiệu suất trong blog này .



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. sqlbulkcopy, tôi muốn ghi đè các hàng hiện tại trong cơ sở dữ liệu

  2. Tạo một hàm có giá trị bảng nội tuyến (ITVF) trong SQL Server

  3. sp_MSforeachdb:chỉ bao gồm kết quả từ cơ sở dữ liệu với kết quả

  4. Tại sao phải chèn khối câu lệnh TSQL khi mức cách ly giao dịch cho một giao dịch khác có thể tuần tự hóa với bộ lọc không xung đột?

  5. Lỗi SQL Server 1934 xảy ra trên CHÈN vào bảng với cột được tính toán PHP / PDO