2011-07-26 2 views
4

직장에서 SSIS 패키지에는 가져 오기 데이터를 보관할 준비 테이블을 만드는 일부 SQL 작업이 있습니다. 나는 테이블을 만들기위한 문의 다른 형태를 볼 Itzik 벤 웨이 코 뮤니시의 T-SQL Fundamentals에서두 T-SQL 문의 차이점은 무엇입니까?

IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'dbo.tbNewTable') AND type in (N'U')) 
BEGIN 
    TRUNCATE TABLE dbo.tbNewTable 
END 
ELSE 
BEGIN 
    CREATE TABLE dbo.tbNewTable (
     ColumnA VARCHAR(10) NULL, 
     ColumnB VARCHAR(10) NULL, 
     ColumnC INT NULL 
    ) ON PRIMARY 
END 

: 모든 문이 양식을

IF OBJECT_ID('dbo.tbNewTable', 'U') IS NOT NULL 
BEGIN 
    DROP TABLE dbo.tbNewTable 
END 

CREATE TABLE dbo.tbNewTable (
    ColumnA VARCHAR(10) NULL, 
    ColumnB VARCHAR(10) NULL, 
    ColumnC INT NULL 
) ON PRIMARY 

이 나타납니다 각각을 같은 일을 할 수 있습니다. 실행 후 dbo 스키마에 tbNewTable이라는 빈 테이블이 있습니다.

둘 사이에 실용적이거나 이론적 인 차이점이 있습니까? 그들이 갖는 의미는 무엇입니까?

+1

임시 테이블은 SQL Server에서 aspcific 의미를 가지며 이러한 테이블 형식이 아닙니다. 스테이징 테이블이라고 불러야합니다. temp 테이블은 정의에 따라 temp db에 있으며 # 또는 ##로 시작합니다. – HLGEM

+0

좋은 지적, HLGEM. 나는 그것을 더 명확하게하기 위해 그것을 편집했다. –

답변

6

테이블이 존재하는 경우 첫 번째 테이블은 테이블과 동일한 열을 가지고 있다고 가정합니다. 두 번째 것은 그러한 가정을하지 않습니다. 따라서 그 이름을 가진 테이블이 존재하고 다른 열 집합을 갖고 있다면이 두 테이블은 매우 다른 결과를 나타냅니다.

+0

Microsoft SQL 용어로 '스키마'라는 단어를 사용하는 데주의해야합니다. 완전히 다른 의미입니다. :) 바로 그 점을 지적하십시오. – Ayyoudy

+0

좋은 지적 - 나는 그것을 편집했다. – hatchet

+0

+1 이미 존재하는 tbNewTable이 생성 될 수있는 것과 동일한 정의를 갖는다는 가정을 지적하기 위해 +1. 이 가정의 위반은 데이터베이스의 일부 지점에서 발생했으며 (테이블 정의가 다른 곳에서 변경되었습니다) 패키지가 손상되었습니다. 대신 –

2

첫 번째 테이블을 실제로 DROP하지 않습니다 - 단지 TRUNCATES이 테이블의 모든 데이터입니다. 그러므로 CREATE가 왜 지켜지고 있는지.

DROP이있는 양식을 사용하면 이전에 tbNewTable이 있었던 경우에도 CREATE를 사용하여 새 테이블을 만들 때 스키마를 변경할 수 있습니다.

DROP/CREATE는 데이터베이스 스키마를 변경하기 때문에 모든 경우에 허용되지 않을 수도 있습니다. 예를 들어 SCHEMABINDING으로 만든보기는 테이블이 삭제되는 것을 방지합니다. (이것은 또한 어떤 존재해야,보다 일반적인 FK 관계에 대한 사실 누르고 있습니다.) SCHEMABINDING이 지정 될 때

는 ..., 기본 테이블 또는 테이블은 뷰 정의에 영향을 줄 수있는 방법으로 수정할 수 없습니다.

자르는 해야 소폭 더 빠르게 상수 "상관 없어"중 하나의 방법이 될 : 다른 걸쳐 하나에 주어진 성능에 고려 사항이 없어야합니다.

권한 차이점도 있습니다. TRUNCATE에는 ALTER 권한 만 필요합니다.

최소 권한은 table_name에 대해 ALTER입니다. TRUNCATE TABLE 권한은 기본적으로 테이블 소유자에게 ...

해피 코딩. 이들은 매우 다른

1

..

첫 번째는는 sys.objects 시스템 테이블에 평등 점검을 수행하고 일치하는 테이블 이름이 있는지 보인다. 그렇다면 테이블을 자릅니다. 기본적으로 모든 행을 제거하지만 테이블 구조 자체는 유지합니다. 즉, 실제 테이블은 삭제되지 않습니다.

OBJECT_ID() 메소드를 사용하여 테이블이 존재하는지 확인합니다. 그렇다면 테이블이 완전히 삭제됩니다 - 행과 구조.

테이블에 기본 및 외래 키 제약 조건이있는 경우 확실히 완전히 삭제하는 것이 좋습니다 ... '테이블을 잘라내려고하는 테이블에 연결된 다른 테이블이 있으면' 계단식 삭제 기능이 켜져 있지 않으면 문제도 발생합니다.

1

SSIS 패키지의 어느 쪽이든을 싫어하는 경향이 있습니다. 나는 배포 스크립트에서 테이블을 생성하고, 내가 사용하는 테이블 중 하나가 나중에 없으면 그 패키지가 실패하기를 원합니다. 그때 크게 잘못된 것이 발생했기 때문에 데이터를 어디 에나두기 전에 조사하기를 원합니다.

+0

+1 테이블을 배포 스크립트에서 생성하는 것이 좋습니다. 이 방법은 테이블이 데이터베이스의 일부이며 패키지의 일부가 아닙니다. 이 방법을 사용하면 테이블 작업이 실패하기 때문에 패키지가 테이블을 변경한다는 가정이 바뀌면 더 쉽게 파악할 수 있습니다. –

관련 문제