ข้อผิดพลาดในสคริปต์ SQL: อนุญาตให้ใช้คำสั่งเดียวต่อชุดงาน


129

ฉันมีสคริปต์ sql 4 ตัวที่ฉันต้องการเรียกใช้ใน DACPAC ใน PostDeployment แต่เมื่อฉันพยายามสร้างโครงการ VS สำหรับ 3 สคริปต์ฉันได้รับข้อผิดพลาดนี้:

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' ระหว่างคำสั่งเนื่องจากข้อผิดพลาดแนะนำไม่ได้ทำอะไรเลย

คำตอบ:


320

ฉันพบปัญหาแล้ว เมื่อฉันเพิ่มไฟล์ใน VS ฉันลืมตั้งค่าBuild Action = Noneจากคุณสมบัติของไฟล์ ดังนั้นการเปลี่ยนแปลงจึงแก้ไขปัญหาและตอนนี้โครงการรวบรวม


27
จับได้ดี ว้าว Microsoft จริงจังไหม ?? ข้อผิดพลาดหรือข้อความนั้นใช้งานง่ายในลักษณะรูปร่างหรือรูปแบบอย่างไร
Mike K

9
ขอบคุณคำตอบนี้ยกเว้นฉันสับสนกับการใช้คำว่า "ลืม" ของคุณ - ทำไมในโลกนี้ถึงต้องรู้ว่าจำเป็นตั้งแต่แรก?
อนุ

2
เพราะฉันเคยทำสคริปต์คล้าย ๆ กันมาแล้วและมีคนบอกฉันเกี่ยวกับ build action none :)
Cosmin Ionascu

สิ่งนี้ได้แก้ไขปัญหาของฉันแล้ว ยกนิ้วให้!
dance2die

3
เยี่ยมมาก! บันทึกวันของฉัน และสร้างความอับอายให้กับ MSBuild สำหรับข้อความที่ทำให้เข้าใจผิด
Dio Phung

9

ไม่ว่าสิ่งนี้จะดูค่อนข้างเก่าฉันก็ติดอยู่กับมันเป็นเวลาหลายชั่วโมงเช่นกันและฉันคิดว่าวิธีนี้อาจเป็นประโยชน์สำหรับหลาย ๆ คน

ในDatabase projectไฟล์ที่ตั้งค่าให้Buildถือเป็นโครงสร้างฐานข้อมูลดังนั้นจึงอนุญาตให้ใช้คำสั่งเดียวในไฟล์ดังกล่าวโดยการออกแบบ Goและตัวยุติแบทช์อื่น ๆ จะไม่เปลี่ยนแปลงพฤติกรรมนั้นข้อความนั้นเป็นเพียงความผิดพลาด ข้อมูลเพิ่มเติมที่นี่

มีตัวเลือกการสร้างอื่น ๆ มากมายสำหรับไฟล์ในโครงการดังกล่าว PostDeployสำหรับกรณีของคุณมันก็ดูเหมือนว่า ในไฟล์ดังกล่าวคุณสามารถมีคำสั่งต่างๆเช่นinsertsฯลฯ

จากนั้นคุณสามารถใช้เอาต์พุตของโครงการฐานข้อมูลเป็นไฟล์ dacpac สำหรับแอปพลิเคชัน Data-Tier DB (มิฉะนั้นจะไม่รวม)


-3

ลบ; (อัฒภาค) ออกจากคำสั่งสุดท้ายของแต่ละคำสั่งและฉันไม่แน่ใจ แต่ไม่จำเป็นต้องใช้ GO ระหว่างคำสั่งแทรกด้านบน


เสร็จแล้ว ไม่ทำอะไรเลย ฉันรู้ว่าไม่จำเป็นต้องใช้ GO แต่ฉันพยายามแล้วเพราะฉันเสียเวลาไปมากกว่า 2 ชั่วโมงกับเรื่องนี้
Cosmin Ionascu

5
การรวมเซมิโคลอนหลังจากแต่ละคำสั่งเป็นไวยากรณ์มาตรฐานและได้รับการสนับสนุนมาหลายปีแล้ว มี 2 ​​สิ่งที่ผิดพลาดเนื่องจากไม่มีเครื่องหมายกึ่งทวิภาค การให้คำแนะนำแก่นักพัฒนาว่าอย่าใส่เครื่องหมายอัฒภาคซึ่งแนวทางปฏิบัติที่ดีที่สุดคือเซมิโคลอน
Brandon
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.