3

作業中の SQL スクリプトがあり、列を作成 (または編集) してからその新しい列を変更しようとすると、問題が発生します。

例えば:

BEGIN
    ALTER TABLE SampleTable ADD ColumnThree int 
END

IF (EXISTS (SELECT * FROM sys.columns WHERE name = 'ColumnThree'))
BEGIN
    UPDATE SampleTable SET ColumnThree = 0
END

ここで、BEGIN/END ブロックがこれら 2 つの項目を分離すると考えましたが、「列名 'ColumnThree' が無効です」というエラーが表示されます。これを実行しようとすると。なんで?最初の BEGIN/END でその ColumnThree などを設定して、その列名が存在しない場合に IF(EXISTS で UPDATE ステートメントが実行されないようにする必要があります。

このようなことを行う正しい方法は何ですか? (これが必要な場合、いくつかの同様のシナリオがあるようです)。

4

1 に答える 1

6

GOではなく、が必要ですBEGIN/ENDEXISTSまた、クエリを少し編集して、正しいテーブルが得られるようにすることもできます。

ALTER TABLE SampleTable ADD ColumnThree int 
GO

IF (EXISTS 
        (SELECT 1 
         FROM 
             sys.columns c 
             INNER JOIN sys.tables t ON 
                 c.object_id = t.object_id 
         WHERE 
             t.name = 'SampleTable' 
             AND c.name = 'ColumnThree'))
BEGIN
    UPDATE SampleTable SET ColumnThree = 0
END

複数のスキーマを使用している場合はsys.schemas、チェックも行う必要があります。

于 2009-08-18T12:53:43.783 に答える