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

SQLサーバーで分割関数をインラインテーブル値のudfに変換するにはどうすればよいですか?

    問題は分割機能にあります。 RBAR ファッション。セットベースのスプリッターを使用する必要があります。これが DelimitedSplit8k 最速のスプリッターの1つであるJeffModenによるもの:

    CREATE FUNCTION [dbo].[DelimitedSplit8K](
        @pString VARCHAR(8000), @pDelimiter CHAR(1)
    )
    RETURNS TABLE WITH SCHEMABINDING AS
    RETURN
    WITH E1(N) AS (
        SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL 
        SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1
    )
    ,E2(N) AS (SELECT 1 FROM E1 a, E1 b)
    ,E4(N) AS (SELECT 1 FROM E2 a, E2 b)
    ,cteTally(N) AS(
        SELECT TOP (ISNULL(DATALENGTH(@pString), 0)) ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) FROM E4
    )
    ,cteStart(N1) AS(
        SELECT 1 UNION ALL 
        SELECT t.N+1 FROM cteTally t WHERE SUBSTRING(@pString, t.N, 1) = @pDelimiter
    ),
    cteLen(N1, L1) AS(
    SELECT 
        s.N1,
        ISNULL(NULLIF(CHARINDEX(@pDelimiter, @pString, s.N1),0) - s.N1, 8000)
    FROM cteStart s
    )
    SELECT 
        ItemNumber = ROW_NUMBER() OVER(ORDER BY l.N1),
        Item       = SUBSTRING(@pString, l.N1, l.L1)
    FROM cteLen l
    

    注:更新された関数については、必ず記事を参照してください

    その他の分割関数については、SirAaronBertrandによる次の記事をお読みください。




    1. Tsrange-2つの範囲の差を計算する

    2. 注意:未定義のインデックス:画像-エラーを見つけることができません

    3. 親の後に現れる子供の順序を維持する方法

    4. 単一のhtmlテーブル(PHP、Mysql)配列への複数のクエリデータが正しい位置に出力されませんか?