sql >> Databáze >  >> RDS >> Sqlserver

Podivné chování TSQL s COALESCE při použití Order By

Nemůžete se spoléhat na zřetězení jako:

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

Plán provádění a výsledky agregovaných dotazů zřetězení závisí na umístění výrazu

Příklad v závislosti na CTE/temp tabulce/prováděcím plánu získáte různé výsledky:

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;

Vytvořil jsem ukázku a váš první dotaz funguje SqlFiddleDemo . Ale vaše řešení je vysoce závislé na plánu realizace.

Použijte XML + STUFF místo toho zřetězení.




  1. Způsobují podtržítka v názvech tabulek MySQL problémy?

  2. Co znamenají hranaté závorky v dotazu Oracle SQL?

  3. SQL Jak nahradit hodnoty select return?

  4. Jaký je doporučený způsob připojení k MySQL z Go?