Sqlserver
 sql >> Teknologi Basis Data >  >> RDS >> Sqlserver

Cara paling efisien untuk membagi string menjadi baris

Inilah fungsi paling berkinerja yang saya miliki:

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

Berikut adalah contoh panggilan yang dapat Anda gunakan untuk menguji hasilnya:

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', '|');

Pilihan lain adalah mencoba solusi CLR berdasarkan kode Adam Machanic yang merupakan pemenang tes kinerja di blog ini .



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Cara membuat SQL Server 2005 CTE untuk mengembalikan catatan orang tua-anak, untuk anak-anak dengan banyak orang tua

  2. SQL Server:perbedaan hari untuk dua tanggal di baris terpisah

  3. SQL - Buat tabel temp atau CTE hari pertama bulan dan nama bulan

  4. kurangi operasi pada dua baris tabel temp di SQL server

  5. Bagaimana cara mengatur batas waktu skrip SQL Server dari dalam skrip?