No puede hacer esto sin el SQL dinámico porque un procedimiento almacenado debe estar en su propio lote. Por lo tanto, no puedes decir:
IF <some condition>
<start a new batch>
La única forma de mantener eso en el mismo lote es usar sp_executesql
.
Si va a escribir el DROP
y CREATE
simultáneamente, simplemente hágalo sin verificar la existencia del objeto. Esto le dará:
DROP PROCEDURE ...;
GO
CREATE PROCEDURE ...;
GO
A quién le importa si el DROP
falla? (¡No debería, porque acabas de crear un guión a partir de él!)
Si está programando esto para otro sistema que podría tiene el objeto, obtendrá un mensaje de error para el DROP
cuando no es así, pero CREATE
todavía sucederá, por lo que puede ignorar el DROP
errores Si realmente lo desea, puede envolver manualmente el DROP
declaraciones en TRY/CATCH
pero no creo que sea necesario.
Si necesita hacer esto para muchos procedimientos, o si realmente necesita que el proceso no genere errores benignos, le sugiero que abandone las opciones de secuencias de comandos primitivas de Management Studio y use una herramienta de terceros para esto. Ya se habrán ocupado de muchos de los problemas que aún no ha enfrentado, pero lo harán. Escribí sobre esto:
http:// bertrandaaron.wordpress.com/2012/04/20/re-blog-el-coste-de-reinventar-la-rueda/