Error en el script SQL: solo se permite una instrucción por lote

128

Tengo 4 scripts sql que quiero ejecutar en un DACPAC en PostDeployment, pero cuando trato de construir el proyecto VS para 3 de ellos obtengo este error:

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

Los scripts contienen solo INSERTdeclaraciones en diferentes tablas en la base de datos. Y todos están estructurados así

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

solo en diferentes tablas y con diferentes datos.

Mi pregunta es ¿por qué VS se queja de 3 de ellos cuando todos los scripts son iguales en términos de sintaxis y operaciones?

PD: Agregar 'GO' entre declaraciones como sugiere el error no hace nada.

Cosmin Ionascu
fuente

Respuestas:

319

He encontrado el problema. Cuando agregué el archivo en VS, olvidé configurarlo Build Action = Nonedesde las propiedades del archivo. Así que cambiar eso solucionó el problema y el proyecto ahora se compila.

Cosmin Ionascu
fuente
26
Gran captura Wow, Microsoft, en serio? ¿Cómo es ese error o su mensaje intuitivo de alguna manera o forma?
Mike K
9
Agradezco esta respuesta, excepto que estoy confundido por el uso de "olvidado": ¿cómo es posible saber qué es necesario en primer lugar?
pettys
2
Porque hice un script similar hace un tiempo y alguien me habló de la acción de compilación none :)
Cosmin Ionascu
Esto ha solucionado mi problema. ¡Pulgares hacia arriba!
dance2die
3
Excelente ! Me salvó el día. Y lástima de MSBuild por un mensaje tan engañoso
Dio Phung
8

Independientemente de que esto parezca bastante viejo, también me quedé por algunas horas y creo que de esta manera podría ser útil para muchos.

En Database project, los archivos configurados Buildse consideran como Estructura de la base de datos, por lo que solo se permite una declaración en dicho archivo por diseño. Goni ningún otro terminador de lotes cambiará ese comportamiento, ese mensaje es solo un error. Más información aquí.

Hay muchas otras opciones de compilación para archivos en dicho proyecto. Para su caso parece que PostDeploy. En dicho archivo podría tener varios comandos como insertsetc.

Luego, puede usar la salida del proyecto de base de datos como archivo dacpac para aplicaciones DB de nivel de datos (de lo contrario, no está incluido).

Jaroslav Kadlec
fuente
-3

Quite el; (punto y coma) del último de cada declaración y no estoy seguro, pero no se requiere GO entre las instrucciones de inserción anteriores.

donstack
fuente
Hecho eso No hace nada Sé que GO no es obligatorio, pero lo intenté porque he perdido más de 2 horas en esto.
Cosmin Ionascu
44
La inclusión de un punto y coma después de cada declaración es una sintaxis estándar y se ha recomendado durante años. Hubo 2 cosas que salieron mal debido a la falta de punto y coma. Aconsejar a un desarrollador que no incluya un punto y coma donde un punto y coma es la mejor práctica es cuestionable.
Brandon