sql >> Database teknologi >  >> RDS >> Sqlserver

Mærkelig TSQL-adfærd med COALESCE, når du bruger Bestil efter

Du kan ikke stole på sammenkædning som:

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

Udførelsesplan og resultater af aggregerede sammenkædningsforespørgsler afhænger af udtryksplacering

Eksempel afhængig af CTE/temp tabel/udførelsesplan vil du få forskellige resultater:

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;

Jeg lavede et eksempel, og din første forespørgsel virker SqlFiddleDemo . Men din løsning er meget afhængig af eksekveringsplanen.

Brug XML + TING til sammenkædning i stedet.




  1. java.sql.SQLEundtagelse:- ORA-01000:maksimale åbne markører overskredet

  2. Hvordan får jeg SQLAlchemy til korrekt at indsætte en unicode-ellipsis i en mySQL-tabel?

  3. Begræns SQL-forespørgsel til kun de to øverste tæller pr. gruppe

  4. iteration gennem rækker af et datagitter