sql >> Database >  >> RDS >> Sqlserver

Vreemd TSQL-gedrag met COALESCE bij gebruik van Order By

U kunt niet afhankelijk zijn van aaneenschakelingen zoals:

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

Uitvoeringsplan en resultaten van samengevoegde aaneenschakelingsquery's zijn afhankelijk van expressielocatie

Voorbeeld afhankelijk van CTE/tijdelijke tabel/uitvoeringsplan krijgt u verschillende resultaten:

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;

Ik heb een voorbeeld gemaakt en je eerste vraag werkt SqlFiddleDemo . Maar uw oplossing is sterk afhankelijk van het uitvoeringsplan.

Gebruik XML + STUFF in plaats daarvan voor aaneenschakeling.




  1. IsNULL en Coalesce correct gebruik

  2. Databaseverbinding sluiten in Laravel 5.1

  3. Welke kolom voor refererende sleutel:id of een andere kolom en waarom?

  4. Big Data met PostgreSQL en Apache Spark