2009-06-17 13 views
2

나는 많은 코드를 가지고 있는데, sysobjects 테이블을 쿼리하여 어디에 놓았는지 확인한 후 다시 놓기 전에 실행하려고한다.IF 존재하지 않는 이유는 무엇입니까?

문제 내가 가서 가끔 경우, 인 :

if not exists (select name from sysobjects o where o.name = 'my_table' and o.type = 'U') 
CREATE TABLE my_table (..) 
go 

작동, 걱정. 그것에 대해

SQL Server Error on (myserver) Error:2714 at Line:10 Message:There is already an object named 'my_table' in the database. 

감사합니다, SQL 프로그래머 : 나는 다시 실행 돌아 왔을 때, 나는이 사랑스러운 오류가 발생합니다. 이미 존재한다면이 테이블을 만들지 말라고 실제로 요구했습니다. -_-

아이디어가 있으십니까?

답변

1

당신이하고있는 일에 대한 논리가 옳지 않은 것처럼 보입니다. 명세서에 기반 :

"내가 드롭하기 전에 객체가있는 경우 내가 확인하기을 sysobjects 테이블을 조회하고있어 어디에서 실행하고 다시 만들려고하고있다"

당신은 다음에 삭제을 간단하게한다 창조. 이 방법은 일반적으로 테이블이 업데이트되도록하기 때문에 더 좋습니다. 테이블이 존재하고 변경 사항이 있으면 원하는 것을 얻지 못할 수도 있습니다.

실행중인 즉각적인 문제는 실행 사이에 일관성이없는 가정 된 db 소유권입니다.

IF 선택 (EXISTS *는 sys.objects 어디에서 OBJECT_ID = OBJECT_ID (N '. [DBO] [XXXX]')에서 입력 (- 아래 설명에 따라

여기에 당신이 할 수있는 것입니다 N'U ')) DROP 표 [DBO]. [XXXX] GO

CREATE TABLE [dbo가]. [XXXX (... GO는

당신은 또 다시이 작업을 실행할 수 있습니다 ..

+0

"이 이전 버전을 제거한 다음이 버전을 설치하십시오."및 "이 버전을 설치하십시오." 이전 버전이없는 경우 버전 "을 선택하십시오. 방금 ​​여러 번 반복해서 실행할 수있는 스크립트 (여러 시스템 코드, 제약 조건을 복제하려는 시스템 오류 등) – glasnt

+0

논리가 잘못되었습니다. if exists를 작성하지 않으면 삭제해야합니다. – mson

+0

'존재하는 경우'를 사용하여 삭제 한 다음 작성합니다. 그렇지 않으면 그냥 만듭니다. 내 논리가 잘못이 아니야. – glasnt

0

sybase 파서 오브젝트 유효성 검사 통과는 전역이며 조건부 평가를 기반으로하지 않습니다. 코드가 CREATE TABLE을 실행할 수는 없지만 시스템이 테이블이 이미 존재할 때 구문이 실패하고 적용될 수 있는지 확인합니다.

내가 알고있는 유일한 방법은 섹션이 실행 된 경우에만 평가되는 EXEC() 내에 create 문을 넣는 것입니다.

+0

이 소리가 맞아.하지만 이걸 시험 할 sybase 사본이 없다. –

0

예, SQL의 전체 배치는 no입니다. 전체 일괄 처리를위한 "실행 계획"을 생성 할 수 있도록 컴파일되고 컴파일됩니다. 정규화 중에 "가능한" "테이블 만들기"문은 컴파일 타임에 이미 존재하는 경우 문제가됩니다.

내 솔루션 : 이름을 변경 -

을 존재하는 경우 (1 ...을 선택) 는 'XYZ' 을 드롭 테이블 XYZ 테이블 xyz_zzzz (...)를 만들 간부 인 sp_rename을 'xyz_zzzz을'시작 end

관련 문제