14

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' という名前のオブジェクトが既に存在します。

それはどうしたの?

4

9 に答える 9

20

これまでに思いついた唯一の回避策は、すぐに実行することです。

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

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

于 2008-11-21T05:49:55.620 に答える
7

create table電話をかける以外に方法はありませんexecute("create table ...")

SYBASEマニュアルによると:

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

if not exists
    (select * from sysobjects where name="my table")
begin
execute "create table mytable(x int)"
end
于 2009-12-22T16:32:10.967 に答える
2

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

于 2008-11-21T17:18:04.343 に答える
1

常にテーブルを作成したいが、条件付きで削除したい場合は、次を使用できます。

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

CREATE TABLE tableNameWithUserPart ...
于 2011-02-21T15:05:32.383 に答える
1

「CREATE TABLE」ステートメントを char @variable に割り当ててから、EXEC(@variable) を実行します。

于 2009-06-12T17:23:15.563 に答える
0

必要な回避策はありません;)

ドキュメントによると:

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 を使用するだけです。

于 2012-11-02T10:21:24.403 に答える
-1

これは、 Sybase 10.01でテストした場合に機能します。

if not exists(select * from SysColumns where tname = 'AAA') then create table DBA.AAA(  UNIQUEID integer not null ) END IF ;
于 2015-01-16T15:36:47.007 に答える
-1
IF object_id('a_table') IS NULL
BEGIN
    CREATE TABLE a_table (
        col1 int not null,
        col2 int null
    ) 
END
于 2008-11-21T05:24:33.970 に答える
-2

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

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

于 2008-12-01T17:20:39.313 に答える