Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Najbardziej wydajny sposób na podzielenie sznurka na rzędy

Oto najbardziej wydajna funkcja, jaką posiadam:

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

Oto przykładowe wywołania, których możesz użyć do przetestowania wyników:

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

Inną opcją jest wypróbowanie rozwiązania CLR opartego na kodzie Adama Machanica, który zwyciężył w teście wydajnościowym na tym blogu .



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Adres serwera SQL do połączenia za pomocą php

  2. Polecenie zamiany programu SQL Server na WIldcard

  3. Wstawianie BULK z FIRE_TRIGGERS nie wykonuje wyzwalacza

  4. Jak ustawić wartość zmiennej za pomocą „wykonaj” w t-sql?

  5. Jak przechowywać obrazy w kolumnie varbinary(max)?