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:
- recuerde duplicar sus citas en las cadenas dinámicas de SQL.
- 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.