sql >> データベース >  >> RDS >> Sqlserver

文字列を行に分割する最も効率的な方法

    これが私が持っている最もパフォーマンスの高い関数です:

    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
    

    結果をテストするために使用できる呼び出しの例を次に示します。

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

    もう 1 つのオプションは、パフォーマンス テスト このブログ内 .



    1. OracleのDATEADD()と同等の関数

    2. mysqlでの正規表現キャプチャグループのシミュレーション

    3. 'xp_cmdshell' SQL Server を有効にする

    4. MariaDBでのNOW()のしくみ