2013-05-13 1 views
3

이상한 행동을 설명해 주시겠습니까?SELECT 문을 사용하여 변수 할당

DECLARE @t VARCHAR(256) = '' 

SELECT @t = @t + CAST(smb.symbol AS VARCHAR(256)) 
FROM (
    SELECT 1,'7' 
    UNION ALL 
    SELECT 2,'8' 
    UNION all 
    SELECT 3,'9' 
) AS smb(n, symbol) 
ORDER BY n 

SELECT @t 

출력 : 나를 위해

789

그게 전부 확인을 클릭합니다.

DECLARE @t VARCHAR(256) = '' 

SELECT @t = @t + CAST(smb.symbol AS VARCHAR(256)) 
FROM (
    SELECT NUMS.N-1 AS N, CHAR(N-1) AS symbol 
    FROM (
     SELECT 1 + n.n1 + nn.n2 * 10 + nnn.n3 * 100 as N 
     FROM (VALUES(0),(1),(2),(3),(4),(5),(6),(7),(8),(9)) AS n(n1) 
      CROSS JOIN (VALUES(0),(1),(2),(3),(4),(5),(6),(7),(8),(9)) AS nn(n2) 
      CROSS JOIN (VALUES(0),(1),(2),(3),(4),(5),(6),(7),(8),(9)) AS nnn(n3) 
    ) AS NUMS 
    WHERE NUMS.N BETWEEN 56 AND 58 
) AS smb(N, symbol) 
ORDER BY smb.N 

SELECT @t 

출력 :

9

그렇다면 번째 예는 마지막 심볼 출력 하는가?

+4

당신은 문서화되지 않은 및 무보증 행동에 의존하고 있습니다. 이 연결 방법은 항상 작동하지는 않습니다. [nvarchar concatenation/index/nvarchar (max) inexplicable behavior]의 가능한 복제본 (http://stackoverflow.com/questions/15138593/nvarchar-concatenation-index-nvarcharmax-inexplicable-behavior) –

+0

재미있는 것을보고 싶습니까? 두 번째 쿼리에서 ORDER BY를 제거하면 789가 반환됩니다. :) 실행 가능한 질문에 대해서는 +1. –

+0

FOR XML PATH ('')를 사용하십시오 – Serge

답변

4

mutlirows 변수 할당을 사용할 때 순서에 의존하지 마십시오.

는 예를 들어이 시도 :

DECLARE @c INT = 0 

SELECT 
@c = @c + x 
FROM (VALUES(1),(2),(3)) AS src(x) 
WHERE x BETWEEN 1 AND 3 
ORDER BY 1 - x DESC 

SELECT @c 

SET @c = 0 

SELECT 
@c = @c + x 
FROM (VALUES(1),(2),(3)) AS src(x) 
WHERE x BETWEEN 1 AND 3 
ORDER BY x DESC 

SELECT @c 

http://sqlmag.com/sql-server/multi-row-variable-assignment-and-order

+2

[ 'ORDER BY'가없는 경우에도 여전히 보장되지 않습니다.] (https://connect.microsoft.com/SQLServer/feedback/details/606786/concatenation-into-a-scalar-variable-using- 연결된 서버 - 인 - 절 - 실패 - 캐스팅 또는 변환 - 데이터). 'ORDER BY가 없어도 @var = @var + 이 여러 행에 영향을주는 모든 명령문에 대해 연결 값을 생성한다는 보장은 없습니다. 유일하게 신뢰할 수있는 방법은 완전히 다른 접근 방식을 사용하는 것입니다. –