1

以下のコードを実行します。

use AdventureWorks2008R2
begin transaction
BEGIN
alter table HumanResources.Department add newcolumn int
update HumanResources.Department set newcolumn=1 where departmentid=1
END
commit

私が得るエラーは次のとおりです。

列名 'newcolumn' が無効です。

ALTERこのようなトランザクションにステートメントを含めることはできますか? もしそうなら、どうすればこのエラーを防ぐことができますか?

私はこれをオンラインで調査しまし。特定の質問に対する答えが見つかりませんでした。

4

3 に答える 3

9

ALTERはい、トランザクションにを含めることができます。UPDATE問題は、パーサーがステートメントの構文を検証し、 ALTER. 1 つの回避策は、動的 SQL を使用することです。これにより、パーサーは実行時まで構文を検査 (および列名を検証) しませんALTER

BEGIN TRANSACTION;

  ALTER TABLE HumanResources.Department ADD newcolumn INT;

  EXEC sp_executesql N'UPDATE HumanResources.Department 
    SET newcolumn = 1 WHERE DepartmentID = 1;';

COMMIT TRANSACTION;

インデントにより、コード ブロックがはるかに簡単に識別できるようになることに注意してください (そして、インデントBEGIN/ENDは不要でした)。

于 2013-08-12T20:36:48.257 に答える
0

アーロンはすでにすべてを説明しました。SSMS のアドホック スクリプトで機能するもう 1 つの方法はGO、スクリプトが 2 つの部分としてサーバーに送信されるようにバッチ区切り記号を挿入することです。IFこれは、最初にスクリプトを分割することが有効な場合にのみ機能します (たとえば、本文を分割することはできません)。

于 2013-08-13T10:26:13.730 に答える
0

列の存在を確認すると、機能するはずです。

BEGIN TRANSACTION;

    IF COL_LENGTH('table_name', 'newcolumn') IS NULL
    BEGIN
        ALTER TABLE table_name ADD newcolumn INT;
    END

  EXEC sp_executesql N'UPDATE table_name
    SET newcolumn = 1 WHERE DepartmentID = 1;';

COMMIT TRANSACTION;
于 2013-08-13T00:52:06.800 に答える