Pregunta

Aquí está mi configuración:

  • Tengo una re-escritura de la hornada ejecutable que utilizo para actualizar mi base de datos.
  • Dentro de ese archivo por lotes, tengo código que dice lo siguiente:
    • Si no existe Tabla 'A', a continuación, crear la tabla 'A' y insertar filas en ella.
  • Más tarde, en esa secuencia de comandos por lotes, creo una enlazada a un esquema vista indizada en esa tabla.
  • A veces , cuando vuelva a ejecutar la secuencia de comandos, que es después de la tabla se ha creado, SQL Server Management Studio evalúa el código "Insertar filas", que está protegido por la ' Si esta tabla no existe' código, y se obtiene el siguiente error:

    Msg 1934, nivel 16, estado 1, línea 15 INSERT fracasado porque las siguientes opciones SET tienen una configuración incorrecta: 'CONCAT_NULL_YIELDS_NULL, ANSI_WARNINGS, ANSI_PADDING, ARITHABORT'. Verificar que las opciones SET son correctas para su uso con puntos de vista y / o índices indexados en columnas calculadas y / o índices y / o notificaciones de consulta y / o métodos de tipo de datos XML y / o operaciones de índice espacial filtrada.

  • Por favor nota: Si alguien fuera a probar esta instrucción INSERT en el vacío, me totalmente espero SSMS para generar este error.
    • y no cuando está protegido por un bloque condicional.

Mi Pregunta:

  

¿El compilador SSMS evalúan todos expresiones, independientemente de que en realidad se ejecutarán?

¿Fue útil?

Solución

Sí, se evalúa todos ellos, echar un vistazo a este

declare @i int
select @i =1

if @i = 1
begin
    declare @i2 int
    set @i2 = 5
end
else 
begin
    declare @i2 int
    set @i2 = 5
end

Msg 134, nivel 15, estado 1, línea 12 El nombre de la variable '@ i2' ya ha sido declarada. Los nombres de variables deben ser únicos dentro de un lote de consultas o un procedimiento almacenado.

Otro ejemplo con tablas temporales está aquí: Lo que se aplazó la resolución de nombres y por qué es lo que necesita el cuidado?

Su única salida sería para envolverlo en el interior de SQL dinámico

Otros consejos

Tenga en cuenta que la mayor parte de los ajustes que mencionas son conexión de nivel, es decir, en caso de configurar / cambiar ellos se quedan en efecto a menos que se cierra la conexión o explícitamente cambian su valor.

Volviendo a su pregunta. El error que se parece a mencionar error de ejecución, es decir, en realidad se está ejecutando el INSERT. Sería mejor si pudiera mostrar su guión (omitir detalles, pero manteniendo lotes).

Editar: no es SSMS compilador que evalúa SQL intenta ejecutar - es SQL Server. ¿Qué es lo que entiende por 'evaluar'? ¿Es 'ejecutar'? Cuando se ejecuta un proceso por lotes (que es lo que realmente está siendo ejecutado por un servidor), SQL Server primero hace el análisis sintáctico y lanza de error en caso de que encuentre cualquier sintáctica de error, nada se está ejecutando en este punto del tiempo. En caso de sintaxis está bien, se inicia el servidor se ejecutan por lotes.

Una vez más, el error que se muestra parece ser tiempo de ejecución - así que supongo que le observe cuidadosamente las condiciones y realizar un seguimiento de lo que sucede (o nos proporciona más detalles acerca 'a veces').

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top