Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Dziwne zachowanie TSQL z COALESCE podczas korzystania z Order By

Nie możesz polegać na konkatenacji, takiej jak:

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

Plan wykonania i wyniki zapytań zagregowanych konkatenacji zależą od lokalizacji wyrażenia

Przykład zależny od CTE/tabeli tymczasowej/planu wykonania, otrzymasz różne wyniki:

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;

Zrobiłem próbkę i Twoje pierwsze zapytanie działa SqlFiddleDemo . Ale Twoje rozwiązanie jest w dużym stopniu zależne od planu wykonania.

Użyj XML + CZĘŚCI zamiast konkatenacji.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Zapytanie o połączenia Sql

  2. Jak zaktualizować wartość atrybutu xml w zmiennej xml za pomocą t-sql?

  3. Definicja warstwy dostępu do danych w .NET 3.5

  4. Jak dowiedzieć się, jakie tabele zawierają dane w pliku w programie SQL Server?

  5. SQL Server 2000 — serwer połączony