Sybase(SQL)で条件付きでテーブルを作成するにはどうすればよいですか?
-
08-07-2019 - |
質問
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