2011-07-21 6 views
2

、私はエラーを取得する:このtsqlの何が問題なのですか?次のスクリプトを実行すると

Msg 207, Level 16, State 1, Line 15 Invalid column name 'b'.

誰もがそれをしてください説明できますか?ありがとう。

DROP TABLE ttt; 
CREATE TABLE ttt(a nvarchar) 

IF NOT EXISTS (SELECT * 
       FROM sys.columns 
       WHERE object_id = OBJECT_ID('dbo.ttt') 
         AND name = 'b') 
    AND EXISTS (SELECT * 
       FROM sys.columns 
       WHERE object_id = OBJECT_ID('dbo.ttt') 
         AND name = 'a') 
    BEGIN 

     ALTER TABLE [dbo].ttt ADD b NVARCHAR 

     UPDATE [dbo].ttt 
     SET  b = a 

     ALTER TABLE [dbo].ttt DROP COLUMN a 
    END 

答えて

2

それは第一を実行する前にこれらのステートメントのすべてをコンパイルしようとしている:

ALTER TABLE [dbo].ttt ADD b NVARCHAR 

    UPDATE [dbo].ttt 
    SET  b = a 

    ALTER TABLE [dbo].ttt DROP COLUMN a 

(実際には、それはバッチ全体だけでなく、これらのステートメントが、ポイントをコンパイルしようとしますコンパイルしようとしている時点で、列は存在しません)

UPDATEステートメントをコンパイルしようとすると、テーブルのメタデータを参照して正しくtを見つけますハットは列が存在しません。

お試しください。EXEC更新ステートメント。

EXEC('UPDATE [dbo].ttt 
    SET  b = a'); 

そしてまた、何オデッドはあなたについて言うことはおそらく、列のサイズを指定したい(これまでで最も無意味なデータ型にそうでない場合は、デフォルトで - nvarchar(1)


このスクリプトは間違いなく実行されますエラーなしで:

​​
+0

EXEC形式に変更され、同じエラーが発生しました。 –

+1

@Yousui - 私はあなたのスクリプト全体をクリーンなサーバにコピーし、上の 'drop table ttt'を削除し、上で指定した' UPDATE'文を変更し、エラーなしで実行しました。まだまったく同じエラーですか?バッチの後半部分(あなたが私たちに示していない部分)は、変更が発生する前にコンパイルされているb列も参照していますか? –

+0

はい、まったく同じエラーが表示されます。 –

2

コードをストアドプロシージャに入れると、そのコードは機能するはずです。プロシージャを作成するときに、表が列aと列bの両方に存在することを確認してください。プロシージャを作成した後、テーブルを削除してテストすることができます。

関連する問題