sql >> Databasteknik >  >> RDS >> Sqlserver

Konstigt TSQL-beteende med COALESCE när du använder Order By

Du kan inte lita på konkatenering som:

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

Utförandeplan och resultat av samlade sammanfogningsfrågor beror på uttryckets plats

Exempel beroende på CTE/temp tabell/exekveringsplan får du olika resultat:

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;

Jag gjorde ett exempel och din första fråga fungerar SqlFiddleDemo . Men din lösning är mycket beroende av utförandeplanen.

Använd XML + SAKER för sammanlänkning istället.




  1. JOOQ misslyckas med PostgreSQL Custom Type som en Array:ERROR:felaktigt utformad post bokstavlig

  2. Sequelize Error:Relation existerar inte

  3. mysql ID automatisk inkrement börjar inte från 0

  4. Konvertera ett tal till ett ord i Mysql