Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Странно поведение на TSQL с COALESCE при използване на Order By

Не можете да разчитате на конкатенация като:

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 + НЕЩА за конкатенация вместо това.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Как да убиете всички текущи връзки към база данни на SQL Server 2005?

  2. Как параметризираните заявки помагат срещу SQL инжектиране?

  3. SQL Server:Как да извличам данни от динамични множество таблици?

  4. SQL :в клауза в съхранената процедура:как да се предават стойности

  5. Естествено присъединяване в SQL Server