2009-02-25 32 views
7

Tengo el siguiente código:¿Cómo funciona SET NOEXEC ON?

-- start of code 
set noexec off 

declare @requiredVersion int 
declare @currentVersion int 

set @requiredVersion = 5 
set @currentVersion = 4 

if (@currentVersion < @requiredVersion) 
begin 
    print 'Please update your DB to version 5 before running this script.' 
    set noexec on 
end 

go 
-- print 'Dummy' 
insert into tblFooBar(name) values ('AAA') 
go 

set noexec off 
-- end of code 

Tenga en cuenta que la tabla "tblfoobar" no existe en la base de datos. Cuando ejecuto este código, el mensaje aparece:

 
Please update your DB to version 5 before running this script. 
Msg 208, Level 16, State 1, Line 1 
Invalid object name 'tblFooBar'. 

que estaba esperando que la creación de noexec en ON no puede dar la parte de "Mensaje 208" del mensaje.

Luego, de nuevo "set noexec on" compila el código, no lo ejecuta. Intentar insertar algo en una tabla que no existe es un error en tiempo de compilación, supongo. Si ese es el caso, entonces debería aparecer el error sobre "objeto faltante".

Ahora déjame decirte el comportamiento extraño que he observado. Si quito el comentario de la línea "- Imprimir 'ficticio'"

-- start of code 
set noexec off 

declare @requiredVersion int 
declare @currentVersion int 

set @requiredVersion = 5 
set @currentVersion = 4 

if (@currentVersion < @requiredVersion) 
begin 
    print 'Please update your DB to version 5 before running this script.' 
    set noexec on 
end 
go 
print 'Dummy' 
insert into tblFooBar(name) values ('AAA') 
go 

y ejecutar el código, sólo aparece el siguiente mensaje.

Actualice su base de datos a la versión 5 antes de ejecutar este script.

Esta vez no hay ningún mensaje acerca de la tabla faltante.

¿Alguien me puede explicar este comportamiento? Gracias.

+0

Solo para asegurarnos de que estamos en la misma página: ¿esto es para el servidor sql? ¿cual version? –

+0

Lo siento, debería haberlo mencionado. He intentado este código usando MS SQL 2000. – ahmjt

+0

Estoy viendo el mismo comportamiento en SQL 2005 –

Respuesta

3

No esperaba que fuera válido usar "set noexec" dentro de un condicional como el que ha hecho, pero de hecho parece ser válido.

El comportamiento parece estar relacionado con el hecho de que es una sentencia DDL. Si reemplaza su inserción con una declaración de impresión o una simple consulta de selección, la secuencia de comandos funciona como se esperaba.

Por cierto, si quiero hacer algo como esto, yo uso el siguiente enfoque:

 
    create proc tmproc_foobar as 
     CREATE TABLE tblFooBar(name nvarchar(20)) 
    go 

    if exists (select 1 from sysobjects where type = 'U' and name = 'tblFooBar') 
     exec tmproc_foobar 
    go 

    drop proc tmproc_foobar 
    go 

SQL Server le permite crear un procedimiento almacenado con un objeto que no existe, por lo que puede crear el procedimiento, ejecutarlo condicionalmente, luego soltarlo. Esta es la forma en que tengo un script de actualización largo que agrega de manera condicional cualquier objeto faltante a mi base de datos.

Puede adaptar esto tal vez. Entonces no necesita el noexec en primer lugar porque evita todo el problema de los objetos no válidos.

+0

Si reemplazo INSERT con SELECT y comenzo PRINT stmt, aparece el primer mensaje de error (objeto faltante). Si guardo la instrucción PRINT, recibo el segundo mensaje de error (nada sobre el objeto faltante). El script no funciona como esperaba (por mí) si reemplazo el INSERT con un SELECT de tblfoobar. – ahmjt

2

He marcado el código anterior y funciona bien. No da ningún mensaje de error para el objeto que falta.

set noexec off 

declare @requiredVersion int 
declare @currentVersion int 

set @requiredVersion = 5 
set @currentVersion = 4 

if (@currentVersion < @requiredVersion) 
begin 
    print 'Please update your DB to version 5 before running this script.' 
    set noexec on--> here we are setting NOEXEC on 
end 

go 
-- print 'Dummy' 
insert into tblFooBar(name) values ('AAA') 
go 

set noexec off 
-- end of code 

Desde NOEXEC está en ahí el siguiente código se compilará no es ejecutado, por lo tanto, no lo hará a través de cualquier mensaje de error.

+0

Parece que funciona bien ahora! No estaba funcionando hace 5 años, y creo que algunos de los comentarios de otros usuarios lo confirmaron. – ahmjt

Cuestiones relacionadas