2017-10-10 1 views
-1
line1 SELECT 'A' 

line2 SELECT CONCAT(a,b); 

line3 SELECT 'B' 

는 SQL Server 2008의이을 시도하고 line1 인해 SQL 서버는 다음 line1가 성공적으로 봤는데해야 할 절차 적 프로그래밍의 경우 일괄 라인 2. 실패에 조회되지 않습니다 발견 질문이 맞습니까?T-SQL 절차 적 프로그래밍

+3

SQL은 절차 적 언어가 아닙니다 ... 선언적 언어입니다. 그것은 언어의 기본 기본 개념 중 하나입니다 ... 또한, SQL Server를 사용하는 경우에는 그 내용이 모두 인쇄되어야합니다.a & b에 작은 따옴표가 없으면 잘못된 열 이름 오류가 발생합니다. –

+0

http://rusanu.com/2013/08/01/understanding-how-sql-server-executes-a-query/ (특히 "파싱 및 편집"부분)을 읽는 것이 도움이 될 수 있습니다. 기본적으로 문을 구문 분석 할 때 오류가 발생하면 문에서 아무 것도 실행하지 않습니다. – ZLK

+1

이 링크는 도움이 될 수 있습니다. https://stackoverflow.com/questions/2668529/what-is-a-batch-and-why-is-go-used. 특히 Quassnoi에서 대답하십시오. –

답변

2

이유는 당신이 컴파일 타임 오류가 아닌 실행 시간을 볼 수 있다는 것입니다. Here은 그 차이점을 밝힐 수있는 몇 가지 예입니다.

데이터베이스 엔진이 컴파일 타임 오류가 발생

은 전체 배치는 전혀 실행되지 않으며, 코드는 하나의 배치를 포함한다. 그래서 결과가 표시되지 않습니다. 그러나이 문을 go (SSMS, sqlcmd 또는이를 인식하는 다른 클라이언트)으로 구분하면 두 번째 문만 건너 뜁니다.

0
SELECT 'A' 

T-SQL에서 유효하며 열 머리글이없는 결과로 A가 표시됩니다. 그러나 쿼리가 하지라는 참조를 만들 않는 기능을 간단하게 사용할 수 없기 때문에이 작동하지 않습니다 SQL 2008 년 A.

SELECT CONCAT(a,b); 

의 값을 보관 유지하는가. 이 행은 세미콜론으로 끝납니다. 단 하나의 선행하는 코드 행은 지속적인 참조를 생성하지 않으므로 a 나 b가 존재하지 않습니다. SQL 2008에서

SELECT a + b; 

이 작동 할 수 있습니다 ( 경우 A와 B가 모두 존재하고 있었다 문자열)

SELECT 'B' 

는 T-SQL에서 유효합니다, 그것은 말 그대로 결과로 B를 표시합니다 열 머리글 없음. 그러나 쿼리는 하지 이후에 참조하기위한 어떤 이름의 값을 제공하지 않습니다

  1. SELECT 'A' 간단한에서 B.

    의 가치를 보유하고 B라는 참조를 생성한다.

  2. 연결의 순서가 잘못되어 다음으로 종료됩니다.
  3. SELECT 'B'은 나중에 참조 할 B의 값을 제공하지 않습니다.

    DECLARE @a AS VARCHAR(10) 
    DECLARE @b AS VARCHAR(10) 
    
    SET @a = 'A' 
    SET @B = 'B' 
    
    SELECT @a + @b 
    ; 
    

    다른 접근법 :

    select a + b 
    from (select 'A' as a, 'B' as b) as derived 
    
    여기

    파생 테이블의 열 A 및 B의 별칭을 부여

T-SQL은 다음 허용하지 이것은 outer select 절에서 참조되어 연결을 수행 할 수 있습니다. 관찰 된 행동

관련 문제