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

Order By 使用時の COALESCE での TSQL の奇妙な動作

    次のような連結に依存することはできません:

    SELECT @result = COALESCE(@result + ',', '') + [Title]
    FROM Episodes
    ...
    

    集計連結クエリの実行計画と結果は、式の場所によって異なります

    CTE/一時テーブル/実行計画に依存する例では、異なる結果が得られます:

    SqlFiddleDemo

    DECLARE @text VARCHAR(MAX) = ''
           ,@text2 VARCHAR(MAX) = '';
    
    SELECT CAST(ROW_NUMBER() OVER (ORDER BY name) AS INT) AS number 
    INTO #numbers 
    FROM master..spt_values 
    
    
    ;WITH numbers (number)
    AS
    (
        SELECT CAST(ROW_NUMBER() OVER (ORDER BY name) AS INT) AS number
        FROM master..spt_values 
    ),a AS
    (
        SELECT number FROM numbers WHERE number < 10
    )
    SELECT      @text = @text + LTRIM(STR(a.number))
    FROM        a
    ORDER BY    a.number DESC
    
    
    ;WITH numbers (number)
    AS
    (
        SELECT number FROM #numbers
    ),
    a
    AS
    (
        SELECT number FROM numbers WHERE number < 10
    )
    SELECT      @text2 = @text2 + LTRIM(STR(a.number))
    FROM        a
    ORDER BY    a.number DESC
    
    SELECT @text, @text2;
    

    サンプルを作成しましたが、最初のクエリは動作しています SqlFiddleDemo .しかし、あなたのソリューションは実行計画に大きく依存しています。

    を使用しますXML + STUFF 代わりに連結のために。




    1. MySQLのブール値のTINYINTとENUM(0、1)

    2. データベーステーブルの事前定義された値からの値を含むことができるフィールドに使用するデータ型は何ですか?

    3. 2つの既知の文字列から文字列を選択するSQLクエリ

    4. MySQL ONLY IN()同等の句