Kesalahan dalam skrip SQL: Hanya satu pernyataan yang diizinkan per batch

128

Saya memiliki 4 skrip sql yang ingin saya jalankan di DACPAC di PostDeployment, tetapi ketika saya mencoba membangun proyek VS untuk 3 diantaranya saya mendapatkan kesalahan ini:

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

Script hanya berisi INSERTpernyataan dalam tabel berbeda pada DB. Dan semuanya terstruktur seperti itu

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

hanya pada tabel berbeda dan dengan data berbeda.

Pertanyaan saya adalah mengapa VS mengeluh tentang 3 dari mereka ketika semua skrip sama dalam hal sintaks dan operasi?

PS: Menambahkan 'GO' di antara pernyataan sebagai kesalahan tidak menunjukkan apa-apa.

Cosmin Ionascu
sumber

Jawaban:

319

Saya telah menemukan masalahnya. Ketika saya menambahkan file dalam VS saya lupa mengatur Build Action = Nonedari properti file. Jadi mengubah itu memperbaiki masalah dan proyek sekarang dikompilasi.

Cosmin Ionascu
sumber
26
Tangkapan yang bagus. Wow, Microsoft, serius ?? Bagaimana kesalahan itu atau pesannya intuitif dengan cara, bentuk, atau bentuk apa pun?
Mike K
9
Hargai jawaban ini, kecuali saya bingung dengan penggunaan Anda "lupa" - bagaimana mungkin orang tahu bahwa itu penting?
pettys
2
Karena saya sudah melakukan script yang sama beberapa waktu lalu dan seseorang memberi tahu saya tentang build action none :)
Cosmin Ionascu
Ini telah memperbaiki masalah saya. Jempolan!
dance2die
3
Bagus ! menyelamatkan hari saya. Dan rasa malu pada MSBuild untuk pesan yang menyesatkan
Dio Phung
8

Terlepas dari ini tampaknya sudah cukup lama saya terjebak selama beberapa jam dengan itu juga dan saya pikir cara ini bisa bermanfaat bagi banyak orang.

Dalam Database project, file ditetapkan sebagai Builddianggap sebagai struktur Database sehingga hanya satu pernyataan yang diizinkan dalam file tersebut dengan desain. Goatau terminator batch lain tidak akan mengubah perilaku itu, pesan itu hanyalah kesalahan. Info lebih lanjut di sini.

Ada banyak opsi build lain untuk file dalam proyek semacam itu. Untuk kasus Anda tampaknya begitu PostDeploy. Dalam file seperti itu Anda dapat memiliki berbagai perintah seperti insertsdll.

Kemudian Anda dapat menggunakan output dari proyek Database sebagai file dacpac untuk aplikasi Data-Tier DB (Kalau tidak itu tidak termasuk).

Jaroslav Kadlec
sumber
-3

Hapus; (semi-colon) dari yang terakhir dari setiap pernyataan dan saya tidak yakin tetapi GO tidak diperlukan antara pernyataan memasukkan di atas.

donstack
sumber
Selesai itu. Tidak melakukan apa-apa. Saya tahu GO tidak diperlukan, tetapi saya mencobanya karena saya sudah membuang lebih dari 2 jam untuk hal ini.
Cosmin Ionascu
4
Termasuk titik koma setelah setiap pernyataan adalah sintaks standar dan telah dianjurkan selama bertahun-tahun. Ada 2 banyak hal yang salah karena kehilangan titik koma. Memberi saran kepada pengembang untuk tidak menyertakan semi-titik dua di mana semi-titik dua merupakan praktik terbaik masih dipertanyakan.
Brandon