Sybase(SQL)で条件付きでテーブルを作成するにはどうすればよいですか?

StackOverflow https://stackoverflow.com/questions/307942

質問

OK。Sybase(12.5.4)を使用すると、テーブルが既に存在する場合、テーブルを削除するために次のことができます。

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

しかし、テーブルの作成で同じことを行おうとすると、テーブルが既に存在することを常に警告されます。次のステートメントを2回実行してみてください。意味がわかります。

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」という名前のオブジェクト   データベース。

それはどういうことですか?

役に立ちましたか?

解決

これまでに考えた唯一の回避策は、execute immediateを使用することです:

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

魅力のように機能し、汚いハックのように感じます。

他のヒント

execute(" create table ...")

create table を呼び出す以外に方法はありません

SYBASEマニュアルによると:

  

if ... elseブロックまたは   whileループでは、Adaptive Serverはテーブルのスキーマを作成します   条件が真かどうかを判断します。これにより、エラーが発生する場合があります   テーブルは既に存在します。この状況を回避するには、   同じ名前のビューがデータベースに存在しないか、使用していません   次のような実行ステートメント:

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

これはテストしていませんが、create tableステートメントをsprocに移動してみてください。その後、既存のifステートメントに基づいて、そのsprocを条件付きで呼び出すことができます。

「CREATE TABLE」を割り当てます; 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 NOT EXISTSを使用します。

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

これは、 Sybase anywhere 10.01でテストしたときに機能します

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

BeginとEndを使用してみてください。

存在しない場合(     SELECTカウント(1)     sysobjectsから     WHERE名= 'a_table'     ANDタイプ= 'U' ) 開始 CREATE TABLE a_table(     col1 intはnullではありません。     col2 int null ) END GO

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top