Lỗi trong tập lệnh SQL: Chỉ cho phép một câu lệnh cho mỗi đợt


128

Tôi có 4 tập lệnh sql mà tôi muốn chạy trong một DACPAC trong PostDeployment, nhưng khi tôi cố gắng xây dựng dự án VS cho 3 trong số chúng, tôi gặp lỗi này:

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

Các tập lệnh chỉ chứa các INSERTcâu lệnh trong các bảng khác nhau trên DB. Và tất cả chúng đều có cấu trúc như vậy

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

chỉ trên các bảng khác nhau và với dữ liệu khác nhau.

Câu hỏi của tôi là tại sao VS phàn nàn về 3 trong số đó khi tất cả các tập lệnh đều giống nhau về cú pháp và thao tác?

PS: Thêm 'GO' giữa các câu lệnh vì lỗi cho thấy không làm gì cả.

Câu trả lời:


319

Tôi đã tìm thấy các vấn đề. Khi tôi thêm tệp trong VS, tôi quên đặt Build Action = Nonetừ thuộc tính tệp. Vì vậy, thay đổi đã khắc phục vấn đề và dự án bây giờ biên dịch.


26
Cú bắt tuyệt vời. Wow, Microsoft, nghiêm túc chứ ?? Làm thế nào là lỗi hoặc thông điệp của nó trực quan trong bất kỳ cách, hình dạng hoặc hình thức?
Mike K

9
Đánh giá cao câu trả lời này, ngoại trừ tôi bối rối với việc bạn sử dụng "quên" - làm thế nào trên thế giới người ta biết điều đó là cần thiết ngay từ đầu?
pettys

2
Bởi vì tôi đã thực hiện một kịch bản tương tự cách đây một thời gian và ai đó đã nói với tôi về việc xây dựng hành động nào :)
Cosmin Ionascu

Điều này đã khắc phục vấn đề của tôi. Đồng ý
dance2die

3
Tuyệt quá ! đã cứu ngày của tôi. Và xấu hổ trên MSBuild vì một thông điệp sai lệch như vậy
Dio Phung

8

Bất kể điều này dường như khá cũ, tôi cũng bị mắc kẹt trong vài giờ với điều đó và tôi nghĩ rằng cách này có thể hữu ích cho nhiều người.

Trong Database project, các tệp được đặt như Buildđược coi là cấu trúc cơ sở dữ liệu, do đó, chỉ một câu lệnh được cho phép trong tệp đó theo thiết kế. GoCũng không có bất kỳ kết thúc hàng loạt khác sẽ thay đổi hành vi đó, thông báo đó chỉ là sai lầm. Thêm thông tin ở đây.

Có rất nhiều tùy chọn xây dựng khác cho các tệp trong dự án đó. Đối với trường hợp của bạn có vẻ như vậy PostDeploy. Trong tập tin như vậy bạn có thể có các lệnh khác nhau như insertsvv

Sau đó, bạn có thể sử dụng đầu ra của dự án Cơ sở dữ liệu dưới dạng tệp dacpac cho các ứng dụng DB cấp dữ liệu (Nếu không thì không bao gồm).


-3

Xóa; (dấu chấm phẩy) khỏi cuối cùng của mỗi câu lệnh và tôi không chắc chắn nhưng GO không bắt buộc giữa các câu lệnh chèn ở trên.


Làm xong mà. Không làm gì cả. Tôi biết GO không bắt buộc, nhưng tôi đã thử vì tôi đã lãng phí hơn 2 giờ cho việc này.
Cosmin Ionascu

4
Bao gồm một dấu chấm phẩy sau mỗi câu lệnh là cú pháp chuẩn và đã được ủng hộ trong nhiều năm. Đã có 2 điều sai lầm do thiếu dấu hai chấm. Tư vấn cho một nhà phát triển không bao gồm một dấu chấm phẩy trong đó một dấu chấm phẩy là cách thực hành tốt nhất là đáng nghi ngờ.
Brandon
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.