web-dev-qa-db-ja.com

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

変更(2列の追加)してから同じテーブルを更新する必要があるという要件があります。

これが私が試したクエリです:

ALTER TABLE A
ADD c1 int,c2 varchar(10)

UPDATE  A set c1 = 23, c2 = 'ZZXX'

上記の2つのクエリを一度に実行する必要があります。

Talend ETLツールを使用しています。これには、複数のクエリを実行できるコンポーネントtMssqlrowがあります(単一のコンポーネントで10〜15の更新クエリを使用しています)。

しかし、上記のクエリは機能していません。

データベースMicrosoftSQLでテストしました。以下のエラーが発生します:

メッセージ207、レベル16、状態1、行5

列名 'c1'が無効です。メッセージ207、

レベル16、状態1、5行目

無効な列名 'c2'。

誰かが私がこの問題を解決するのを手伝ってくれる?.

19
Raghunath

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

ただし、EXECを使用して子バッチで実行できます。

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

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

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

または、デフォルトの制約を使用して、1つのステートメントで同様の結果を得ることができます。

ALTER TABLE A
  ADD c1 INT NULL CONSTRAINT DF_A_c1 DEFAULT 23 WITH VALUES, 
     c2 VARCHAR(10) CONSTRAINT DF_A_c2 NULL DEFAULT 'ZZXX' WITH VALUES;

ただし、これは元のクエリとまったく同じではありません。デフォルトの制約が残され、削除する必要がある場合があるためです。

29
Martin Smith

2つのクエリ間でGOを使用します。

2
Nilesh Thakkar