Sybase (TSQL)에서 테이블을 조건부로 만드는 방법은 무엇입니까?
-
08-07-2019 - |
문제
좋아, 따라서 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)끝가다