문제

좋아, 따라서 Sybase (12.5.4)는 이미 존재하는 경우 테이블을 떨어 뜨리기 위해 다음을 수행하게 할 것입니다.

IF EXISTS (
    SELECT 1
    FROM sysobjects
    WHERE name = 'a_table'
    AND type = 'U'
)
DROP TABLE a_table
GO

그러나 테이블 생성과 똑같이하려고한다면, 테이블이 이미 존재한다는 경고를받습니다. 테이블이 내 테이블을 만들려고했기 때문에 테이블이 이미 존재한다는 경고를 받고 조건 진술을 무시했습니다. 다음 진술을 두 번 실행해보십시오. 내가 의미하는 바를 볼 수 있습니다.

IF NOT EXISTS (
    SELECT 1
    FROM sysobjects
    WHERE name = 'a_table'
    AND type = 'U'
)
CREATE TABLE a_table (
    col1 int not null,
    col2 int null
)
GO

위를 실행하면 다음 오류가 발생합니다.

SQL Server 오류 (LocalHost) 오류 : 2714 라인 : 7 메시지 : 데이터베이스에는 이미 'a_table'이라는 객체가 있습니다.

그 거래는 무엇입니까?!

도움이 되었습니까?

해결책

지금까지 제가 생각해 낸 유일한 해결 방법은 즉시 실행을 사용하는 것입니다.

IF NOT EXISTS (
    SELECT 1
    FROM sysobjects
    WHERE name = 'a_table'
    AND type = 'U'
)
EXECUTE("CREATE TABLE a_table (
    col1 int not null,
    col2 int null
)")
GO

매력처럼 작동하며 더러운 해킹처럼 느껴집니다.

다른 팁

전화하는 것 외에는 다른 방법이 없습니다 create table 안에 execute("create table ...")

Sybase 매뉴얼의 말 :

IF ... ELSE 블록 또는 WIDE 루프 내에서 테이블 작성 명령이 발생하면 조건이 TRUE인지 결정하기 전에 적응 형 서버가 테이블의 스키마를 만듭니다. 테이블이 이미 존재하면 오류가 발생할 수 있습니다. 이 상황을 피하려면 동일한 이름의보기가 데이터베이스에 아직 존재하지 않거나 다음과 같이 Execute 문을 사용하십시오.

if not exists
    (select * from sysobjects where name="my table")
begin
execute "create table mytable(x int)"
end

이것을 테스트하지는 않았지만 Create Table 문을 SPROC로 옮길 수 있습니다. 그런 다음 기존 IF 문을 기반으로 해당 스프로를 조건부로 호출 할 수 있습니다.

char @variable에 "테이블 작성"명령문을 할당 한 다음 exec (@variable)를 수행하십시오.

항상 테이블을 만들고 싶지만 조건부로 떨어 뜨리려면 다음을 사용할 수 있습니다.

IF(SELECT count(*) FROM sysobjects WHERE name="tableNameWithoutUserPart") > 0
    DROP TABLE tableNameWithUserPart
GO

CREATE TABLE tableNameWithUserPart ...

필요한 해결 방법이 필요하지 않습니다.)

문서에 따르면 :

CREATE [ GLOBAL TEMPORARY ] TABLE [ IF NOT EXISTS ] [ owner.]table-name
( { column-definition | table-constraint | pctfree }, ... )
[ { IN | ON } dbspace-name ]
[ ENCRYPTED ]
[ ON COMMIT { DELETE | PRESERVE } ROWS
   | NOT TRANSACTIONAL ]
[ AT location-string ]
[ SHARE BY ALL ]

존재하지 않으면 사용하십시오.

IF object_id('a_table') IS NULL
BEGIN
    CREATE TABLE a_table (
        col1 int not null,
        col2 int null
    ) 
END

테스트 할 때 작동합니다 Sybase 어디에서 10.01 :

if not exists(select * from SysColumns where tname = 'AAA') then create table DBA.AAA(  UNIQUEID integer not null ) END IF ;

시작과 끝을 사용해보십시오.

존재하지 않는 경우 (이름 = 'a_table'및 type = 'u'인 sysobjects에서 count (1)를 선택하십시오)시작하다테이블 생성 a_table (col1 int not null, col2 int null)가다

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top