vista validar salida saber procedimientos procedimiento permisos parametros para existe ejecutar almacenados almacenado sql sql-server

validar - saber si existe vista sql



crear un procedimiento almacenado si no existe en el servidor SQL (3)

Esto funcionará y mantendrá los permisos intactos:

use [myDatabase] go if object_id(''dbo.myProcedure'', ''p'') is null exec (''create procedure myProcedure as select 1'') go alter procedure myProcedure as SET NOCOUNT ON -- real sproc code here. you don''t really need BEGIN-END go

Oracle hace "crear o reemplazar" declaraciones. El servidor Sql no parece: si está ejecutando scripts desde Enterprise Manager, en su lugar sugiere "soltar y crear" en su lugar. Eliminar y crear es indeseable en cualquier situación en la que haya realizado concesiones en el procedimiento almacenado, porque elimina cualquier concesión que haya hecho su equipo de administración de base de datos. Realmente necesita "crear o reemplazar" para ayudar con la separación de problemas entre desarrolladores y administradores.

Lo que he estado haciendo recientemente es esto:

use [myDatabase] go create procedure myProcedure as begin print ''placeholder'' end go alter procedure myProcedure as begin -- real sproc code here end go

Esto hace lo que quiero. Si el procedimiento no existe, créelo y modifíquelo en el código correcto. Si el procedimiento existe, la creación falla y la modificación actualiza el código con el nuevo código.

Crea un problema diferente para los administradores, porque la creación genera un error engañoso si el procedimiento almacenado ya existe. Engañoso, por supuesto, en el hecho de que no debería ver el texto de error rojo cuando se produjo el resultado deseado.

¿Alguien tiene una manera de suprimir el texto rojo? Todo lo que he intentado conduce a un ''CREAR / ALTERAR PROCEDIMIENTO debe ser la primera declaración en un error de lote de consulta'' de alguna manera u otra.


Finalmente, el día es aquí donde SQL Server ha implementado un equivalente a Crear o Reemplazar. Su equivalente es "Crear o Alterar". Esto está disponible a partir de SQL Server 2016 SP1. Ejemplo de uso:

use [myDatabase] go Create or Alter procedure myProcedure as begin -- procedure code here end go


Me gusta esto:

IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N''[dbo].[myProcedure]'') AND type in (N''P'', N''PC'')) BEGIN EXEC('' create procedure myProcedure as begin print ''''placeholder'''' end '') END EXEC('' alter procedure myProcedure as begin -- real sproc code here end '')

NOTAS:

  1. recuerde duplicar sus citas en las cadenas dinámicas de SQL.
  2. Lo he sangrado para facilitar la lectura, pero eso también agregará espacios de sangría adicionales a sus listas de procedimientos reales. Si no lo hace, entonces simplemente reduzca el nivel de sangría en el texto dinámico de SQL.