2008-10-10 17 views
6

estoy usando SqlServer por primera vez, y en cada uno de nuestros crear secuencias de procedimientos hay un bloque de código, como a continuación para eliminar el procedimiento si ya existe:Dar DROP PROCEDIMIENTO un parámetro

IF EXISTS (SELECT * 
      FROM information_schema.routines 
      WHERE routine_name = 'SomeProcedureName' 
      AND routine_type = 'PROCEDURE' 

BEGIN 
    DROP PROCEDURE SomeProcedureName 
END 
//then the procedure definition 

dejar de cortar y pegar este código estándar en todos los archivos quisiera poner este código en su propio procedimiento almacenado para que en lugar de las secuencias de comandos se parecería a esto:

DropIfRequired('SomeProcedureName') 
//then the procedure definition 

Mi intento de solución es:

CREATE PROCEDURE DropIfRequired 
(
    @procedureName varchar 
) 
AS 
IF EXISTS (SELECT * FROM information_schema.routines 
      WHERE routine_name = @procedureName 
      AND routine_type = 'PROCEDURE') 
BEGIN 
    DROP PROCEDURE @procedureName 
END 

Pero entonces sale el siguiente error:

Msg 102, nivel 15, estado 1, procedimiento deleteProcedure, línea 10 sintaxis incorrecta cerca de '@procedureName'.

¿Alguna idea de cómo hacer lo que quiero?

+0

Esto [la respuesta] (http://dba.stackexchange.com/q/47186/16776) para más soluciones a esto. – Sam

Respuesta

7

La respuesta completa es:

 
DECLARE @SQL VARCHAR(8000) 
SELECT @SQL = 'USE ' + DB_NAME() + CHAR(10) 
SET @SQL = @SQL + 'DROP PROCEDURE ' + @procName 
--PRINT @SQL 
EXEC(@SQL) 

la dada por Andrew sólo funcionará si la base de datos predeterminada para el inicio de sesión se establece en la base de datos que desea. Al usar sql dinámico, obtienes un nuevo contexto de base de datos. Entonces, si no tiene un conjunto de bases de datos predeterminado, ejecutará el comando desde el maestro.

+0

Sí, eso es correcto. Me he quemado por ese descuido antes. – StingyJack

3

sus comillas que faltan, intente agregarlas con una declaración ejecutiva.

EXEC('DROP PROCEDURE ''' + @procName + '''') (all single quotes) 
+0

Quizás mejor 'exec ('DROP PROCEDURE [' + @procName + ']')' – abatishchev

4

Una cosa a tener en cuenta es que en el procedimiento DropIfRequired, que ha definido el nombre del procedimiento de la siguiente manera:

CREATE PROCEDURE DropIfRequired 
( 
    @procedureName varchar 
) 

es necesario definir una longitud del parámetro VARCHAR, de lo contrario SQL asumirá una longitud de uno personaje. En su lugar, hacer algo como el siguiente (1000 debería ser más que suficiente para la mayoría de los nombres de procedimiento)

CREATE PROCEDURE DropIfRequired 
( 
    @procedureName varchar(1000) 
) 
+0

También podría usar el tipo de datos sysname (equivalente a nvarchar (128)), que acomodaría cualquier nombre de objeto válido. – GilM

+0

"1000 debería ser más que suficiente para * la mayoría de los nombres de procedimientos" ... Me estremezco al pensar en las excepciones. –

Cuestiones relacionadas