4

1 つの新しい列column2test_tblに追加し、その列をデフォルト値'N/A' ではなくnullに設定しようとしました。声明は次のとおりです。

if not exists (select 1 from syscolumns where object_name(id) = 'test_tbl' and name = 'column2')
begin
  alter table test_tbl add column2 varchar(20) default 'N/A' not null
end

エラーは

Could not execute statement.
Column names in each table must be unique. Column name 'column2' in table 'test_tbl' is specified more than once.
Sybase error code=2705
Severity Level=16, State=3, Transaction State=1
Line 4

しかし、nullableである列を1つ追加すると。

if not exists (select 1 from syscolumns where object_name(id) = 'test_tbl' and name = 'column2')
begin
    alter table test_tbl add column2 varchar(20) null
end

それはうまくいくかもしれません。私はこれらととても混乱しています。いくつかのタグを検索したところ、動的 SQL が機能することがわかりました。

実行時ではなく、正規化中にエラーが発生しています (解析ツリーが正規化されたクエリ ツリーに変換されているため)。動的 sql の内容は、実際に呼び出されるまで処理されず、エラーを回避します。

Sybase DOC の if...else について

alter table、create table、または create view コマンドが if...else ブロック内で発生すると、Adaptive Server は、条件が true かどうかを判断する前に、テーブルまたはビューのスキーマを作成します。テーブルまたはビューが既に存在する場合、これによりエラーが発生する可能性があります。

null 許容列ステートメントがエラーなしで実行できる理由を知りたい!

4

3 に答える 3

5

Sybase ASE 15 でも同じ動作が見られます

Sybase Documentaiton から既に引用した以上の説明を提供することはできませんが、次のように、alter table の呼び出しを execute() ステートメントでラップすることにより、一貫した動作をスクリプト化できます。

if not exists (select 1 from syscolumns where object_name(id) = 'tbl_test' and name = 'column2')
begin     
    execute("
        alter table tbl_test add column2 varchar(20) default 'N/A' not null
    ")
end

if...elseサーバーは、alter ステートメントを実行する前に、このインスタンスのステートメントを評価できると思います。

于 2012-07-13T15:25:46.697 に答える
0

あなたは書くべきですgo..

以下のコードを確認してください。私にとっては正常に機能しています

IF  EXISTS ( SELECT 1 FROM sysobjects WHERE name = 'a_table' AND type = 'U' )
drop table a_table
go
CREATE TABLE a_table ( col1 int not null,col2 int null )
go
于 2017-09-07T09:22:24.043 に答える