2017-11-14 13 views
0

SELECT을 사용하여 값을 할당 할 T-SQL 변수가 있습니다. "SELECT"쿼리는 여러 행을 반환 할 수 있으므로 모든 값을 쉼표로 구분하여 추가하는 COALESCE 함수를 사용하고 있습니다. 지금까지 모든 좋은 쿼리는 의도 한대로 동작합니다. 그러나 order by 절을 사용하여 값을 정렬하려고하면 변수에 한 행만 추가됩니다.COALESCE와 함께 사용할 때 주문이 영향을 미치는 방식은 무엇입니까

왜 쿼리 2의 Order By 절을 추가하면 쿼리 1과 다른 결과가 발생합니까?

[결과 1] :

볼 (1), 볼 (2), 배트 3 배트 1 배트 2

[결과 2] :

박쥐 1

(210)

JS 바이올린 링크 : http://sqlfiddle.com/#!6/8dad1/15

[SQL 바이올린] [1]

MS SQL 서버 2014 스키마 설정 :

CREATE TABLE tbl_Trans 
([Id] int, [Instrument] varchar(20), [Trans_Type] int, [Quantity] int); 

CREATE TABLE tbl_Trans_Type 
([Id] int, [Trans_Type] varchar(20)); 

INSERT INTO tbl_Trans ([Id], [Instrument], [Trans_Type], [Quantity]) 

VALUES 
(1,'Ball 1', 121, 50), 
(2,'Ball 2', 121, 20), 
(3,'Bat 3', 122, 1000), 
(4,'Bat 1', 124, 400), 
(5,'Bat 2', 121, 300); 


INSERT INTO tbl_Trans_Type ([Id], [Trans_Type]) 

VALUES 
(121,'Buy'), 
(122,'Sell'), 
(123,'ReSell'), 
(124,'Rent') 

**Query 1**: 

DECLARE @ST VARCHAR(500) = NULL 
SELECT @ST = COALESCE(@ST+ ',' , '')+Instrument 
FROM tbl_Trans a 
LEFT JOIN tbl_Trans_Type b on a.Trans_Type = b.Id 

SELECT @ST 

[결과 1] :

| Ball 1,Ball 2,Bat 3,Bat 1,Bat 2 | 
,

쿼리 2 :

DECLARE @ST2 VARCHAR(500) = NULL 
SELECT @ST2 = COALESCE(@ST2+ ',' , '')+Instrument 
FROM tbl_Trans a 
LEFT JOIN tbl_Trans_Type b on a.Trans_Type = b.Id 
ORDER BY IIF(b.Trans_Type='Buy',1,2) 

SELECT @ST2 

[결과 2] :

SELECT STUFF 
(
    (
     SELECT ',' +Instrument 
     FROM tbl_Trans a 
     LEFT JOIN tbl_Trans_Type b 
      on a.Trans_Type = b.Id 
     ORDER BY IIF(b.Trans_Type='Buy',1,2) 
     FOR XML PATH(''), TYPE 
    ).value('.', 'VARCHAR(MAX)') 
    ,1 
    ,1 
    ,'' 
); 
+0

에 의해 주문 쉼표로 구분 된 값으로 행을 성공적으로 변환 다음 쿼리를 사용합니다. SQL/t-sql/language-elements/set-local-variable-transact-sql #주의) (필자는 잘못 생각한 문서라고 생각하지만, 영원히) : "SELECT 문에서 변수를 사용하여 값을 연결하지 마십시오 [...] SELECT 목록의 모든 표현식 (** 포함)은 ** 각 출력 행에 대해 ** 정확히 한 번 ** 실행되도록 보장되지 않기 때문입니다 " –

답변

0

: 당신이 연결할하려는 경우

| Bat 1 | 
+0

'ORDER BY'가 없어도 정의되지 않은 것으로 문서화되었습니다. –

+0

도와 주신 Nandish와 Damien-The-Unbeliever에게 감사드립니다.나는이 행동에 대해 정말로 혼란스러워했다. –

0

하지만 주문이 시도 티 그는 당신이보고있는 행동을 의도적으로합니다. ORDER BY 절을 사용하여 쿼리에서 할당 작업 (이 시나리오의 연결)을 사용하면 정의되지 않은 동작이 발생합니다.

은 (https://docs.microsoft를 [워드 프로세서에서이 작업을 수행하려고에 대한 경고가]이 절

select stuff((select ','+Instrument 
FROM tbl_Trans a 
    LEFT JOIN tbl_Trans_Type b on a.Trans_Type = b.Id 
ORDER BY IIF(b.Trans_Type='Buy',1,2) 
for xml path('')) ,1,1,'')