SQLスクリプトのエラー:バッチごとに許可されるステートメントは1つだけです


128

PostDeploymentのDACPACで実行したい4つのSQLスクリプトがありますが、そのうちの3つのVSプロジェクトをビルドしようとすると、次のエラーが発生します。

Only one statement is allowed per batch. A batch separator, such as 'GO', might be required between statements.

スクリプトにはINSERT、DBの異なるテーブルのステートメントのみが含まれます。そしてそれらすべてはそのように構成されています

IF NOT EXISTS (SELECT 1 FROM dbo.Criteria WHERE Name = 'Mileage') INSERT INTO dbo.Criteria(Name) VALUES ('Mileage');

異なるテーブルと異なるデータでのみ。

私の質問は、構文と操作の点ですべてのスクリプトが同じであるのに、VSが3つについて不平を言うのはなぜですか?

PS:エラーが示唆するようにステートメントの間に「GO」を追加しても何も起こりません。

回答:


319

問題を発見しました。ファイルをVSに追加したときにBuild Action = None、ファイルのプロパティから設定するのを忘れていました。変更すると問題が修正され、プロジェクトがコンパイルされます。


26
グレートキャッチ。うわー、マイクロソフト、真剣に?? そのエラーまたはそのメッセージは、どのような形、形、または形で直感的ですか?
Mike K

9
私があなたの「忘れた」の使用に混乱しているのを除いて、この答えに感謝します-そもそもそれが必要であることを世界でどのように知るのですか?
ペティ2014

2
しばらく前に同じようなスクリプトを作成していて、ビルドアクションなしについて誰かが私に言ったからです:)
Cosmin Ionascu

これで問題が解決しました。いいぞ!
dance2die

3
すごい !私の日を救った。そして、このような誤解を招くメッセージのMSBuildの上の恥
ディオフン

8

とにかくこれはかなり古いようですが、何時間もそれで立ち往生していたので、この方法は多くの人に役立つと思います。

ではDatabase project、として設定されたファイルBuildはデータベース構造と見なされるため、そのようなファイルでは設計上1つのステートメントしか許可されていません。Go他のバッチターミネーターもその動作を変更しません。そのメッセージは単なる誤りです。詳細はこちら。

そのようなプロジェクトには、ファイルの他の多くのビルドオプションがあります。あなたの場合、それはそうですPostDeploy。このようなファイルでは、insertsなどのさまざまなコマンドを使用できます。

次に、データベースプロジェクトの出力をデータ層DBアプリケーションのdacpacファイルとして使用できます(それ以外の場合は含まれません)。


-3

各ステートメントの最後から;(セミコロン)を削除します。よくわかりませんが、上記の挿入ステートメントの間にGOは必要ありません。


やった。何もしません。GOは必須ではないことはわかっていますが、2時間以上も無駄にしてしまったため、試しました。
Cosmin Ionascu 2013

4
各ステートメントの後にセミコロンを含めることは標準的な構文であり、長年にわたって提唱されてきました。セミコロンがないために2つの多くの問題が発生しました。セミコロンがベストプラクティスである場合、セミコロンを含めないように開発者に助言することは疑問です。
ブランドン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.