2017-04-07 1 views
0

SQL 문의 실행 순서와 관련된 SQL 스크립트 또는 SQL Server가 시작하기 전에 수행하는 오류 검사와 관련하여 문제가 있습니다.문 SQL Server SQL 스크립트의 실행 순서

이것은 코드를 단순화 한 것이지만 배경에 대해 테이블 ​​finalTable은이 스크립트로 지워지고 다시 채워집니다. DB에 이미 있지만 추가중인 새 열이 없습니다. 이 예에서 참조하기 위해 Col1은 기존 열이고 Col2는 새로운 것입니다.

코드를 모두 실행하면 잘못된 열 이름 'Col2'가 표시됩니다. 각 블록을 개별적으로 실행하면 모든 것이 정상적으로 작동합니다.

블록 A :

SQL to create temporary tables 

블록 B :

drop table dbo.finalTable; 
create table dbo.finalTable (col1 int, col2 int); 

블록 C :

insert into dbo.finalTable(col1, col2) select col1, col2 from #tempTable; 
+0

추가 참고로 : 일괄 처리가 컴파일 될 때 처음 SELECTALTER TABLE을 비롯한 모든 문은,이 배치에 COL2가 존재하지 않기 때문에 실행되지 않습니다 새 열이없고 이전 데이터가 남아 있습니다. 해당 세션에서 tempTable을 쿼리하면 정확한 현재 데이터가 있습니다. – MeteorMan

+0

전체 스크립트를 표시하십시오. – mallan1121

+0

나는 1800 개의 선을 소유하고 있지만 소유권이있는 정보가 있습니다. – MeteorMan

답변

1

에 시도 할 수 있지만, 증상이 deferred name resolution을 제안한다. 문제는 명령문 실행 순서가 아니라 컴파일 순서입니다.

SQL Server는 명령문을 실행하기 위해 제출할 때 구문 오류를 확인합니다. 구문 적으로 올바른 경우 기존 개체를 참조하는 문은 기존 스키마에 대해 유효성이 검사됩니다. 존재하지 않는 오브젝트를 참조하는 명령문의 컴파일은 실행 시간까지 지연됩니다. 성명은 기존 테이블의 존재하지 않는 열을 참조 할 때 전체 배치의

CREATE TABLE dbo.finalTable (col1 int); 
--Compilation of this statement is not done until execution time due to deferred name resolution 
SELECT col1 FROM dbo.finaltable; 
GO 

컴파일이 실패 : 지연된 이름 확인은 하나의 테이블을 생성하고 같은 배치에 사용할 수 있습니다. 내가 finalTable를 조회 할 경우는 잘못된 열 이름 메시지를 수신 한 후 -

SELECT col1 FROM dbo.finaltable; 
ALTER TABLE dbo.finaltable 
    ADD col2 int NULL; 
SELECT col1, col2 FROM dbo.finaltable; 
GO 
0

는 동일한 데이터베이스 스크립트 실행되고 사용자가 실행하면 finalTable이 존재 전체 스크립트? 당신은 스크립트가 오류의 정확한 원인을 파악하기에 충분히 설명되지 않습니다 게시 된 조각

IF OBJECT_ID('databasename.dbo.finalTable', 'U') IS NOT NULL 
     DROP TABLE databasename.dbo.finalTable;