2

SQL Server でさまざまな SQL スクリプトを実行するカスタム データベース アップデーターがあります。一部のスクリプトでは、テーブルに新しい列を追加してから、トランザクション内の 1 つのスクリプトで値を入力する必要があります。

using (var scope = new TransactionScope()) {

    ... alter table MyTable add FOOBAR int;
    ... update schappointment set FOOBAR = 1;

}

問題は、「alter table」コマンドが有効になっていないため、SQL が「Invalid column name 'FOOBAR'」を吐き出すことです。それをラップしexec()ても違いはありません。

    ... exec('alter table MyTable add FOOBAR int;')
    ... update schappointment set FOOBAR = 1;

GO コマンド (有効な T-SQL コマンドではないことがわかっています) で分割されるため、SQL Management Studio 内で問題なく動作します。

プロジェクトに新しい依存関係を作成しないことをお勧めします。

私の好みは、スキーマ スクリプトとデータ スクリプトを分割しないことです。これにより、SQL を満足させる以外の理由でスクリプトの数が 2 倍になるからです。

どうすればこれを解決できますか?

4

2 に答える 2

3

これを単一のステートメント (またはバッチ) で正確に実行することはできません。また、使用しているツールがGOバッチ区切り文字としてサポートされていないようです。

EXECただし、子バッチで実行するために使用できます。

ALTER TABLE A
  ADD c1 INT, c2 VARCHAR(10);

EXEC('
UPDATE A
SET    c1 = 23,
       c2 = ''ZZXX'';
    ');

注意: クエリ内のすべての一重引用符は、文字列リテラル内でエスケープするために、上記のように二重にする必要があります。

私はこのアプローチを試しましたが、これは機能しています。

テーブルを変更してから単一のステートメントで更新する

于 2016-05-31T07:36:40.223 に答える
0

私たちの解決策は、スクリプト全体に「GO」コマンドを散りばめ、スクリプト実行機能をカスタマイズして、それらを分割して個別に実行することでした。

これは、SQL 管理スタジオの機能を模倣し、機能しているように見えます。

于 2014-09-03T10:44:39.767 に答える