Tengo que escribir un script de implementación que funcione si existe o no existe un procedimiento almacenado. es decir, si existe, entonces necesito alterarlo, de lo contrario crearlo.
¿Cómo puedo hacer esto en el sql?
Estoy usando SQL Server 2005
Tengo que escribir un script de implementación que funcione si existe o no existe un procedimiento almacenado. es decir, si existe, entonces necesito alterarlo, de lo contrario crearlo.
¿Cómo puedo hacer esto en el sql?
Estoy usando SQL Server 2005
Respuestas:
Si DROP y CREATE el procedimiento, perderá la configuración de seguridad. Esto podría molestar a su DBA o romper su aplicación por completo.
Lo que hago es crear un procedimiento almacenado trivial si aún no existe. Después de eso, puede ALTERAR el procedimiento almacenado a su gusto.
IF object_id('YourSp') IS NULL
EXEC ('create procedure dbo.YourSp as select 1')
GO
ALTER PROCEDURE dbo.YourSp
AS
...
De esta manera, la configuración de seguridad, los comentarios y otros meta deta sobrevivirán a la implementación.
if object_id('YourSp') is null BEGIN ... ENDpara agregar los permisos adecuados después de crear el procedimiento almacenado.
La forma más limpia es probar su existencia, descartarla si existe y luego recrearla. No puede incrustar una declaración "create proc" dentro de una declaración IF. Esto debería funcionar bien:
IF OBJECT_ID('MySproc', 'P') IS NOT NULL
DROP PROC MySproc
GO
CREATE PROC MySproc
AS
BEGIN
...
END
Si solo se trata de procedimientos almacenados, lo más fácil es probablemente abandonar el proceso y luego volver a crearlo. Puede generar todo el código para hacerlo utilizando el asistente Generar secuencias de comandos en SQL Server.
IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[YourSproc]') AND type in (N'P', N'PC'))
DROP PROCEDURE [dbo].[YourSproc]
CREATE PROCEDURE YourSproc...
if not exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[xxx]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
BEGIN
CREATE PROCEDURE dbo.xxx
donde xxxesta el nombre del proceso
Además de lo que ya se ha dicho, también me gusta agregar un enfoque diferente y abogar por el uso de una estrategia de implementación de script diferencial. En lugar de crear una secuencia de comandos con estado que siempre verifique el estado actual y actúe en función de ese estado, implemente a través de una serie de secuencias de comandos sin estado que se actualicen desde versiones conocidas . He usado esta estrategia y vale mucho la pena ya que mis scripts de implementación ahora están libres de 'IF'.
Puede escribir una consulta de la siguiente manera:
IF OBJECT_ID('ProcedureName','P') IS NOT NULL
DROP PROC ProcedureName
GO
CREATE PROCEDURE [dbo].[ProcedureName]
...your query here....
Para ser más específico sobre la sintaxis anterior:
OBJECT_ID es un número de identificación único para un objeto dentro de la base de datos, SQL Server lo utiliza internamente. Dado que estamos pasando ProcedureName seguido de su tipo de objeto P, que le dice al SQL Server que debe encontrar el objeto llamado ProcedureName, que es de tipo procedimiento, es decir, P
Esta consulta encontrará el procedimiento y, si está disponible, lo descartará y creará uno nuevo.
Para obtener información detallada sobre OBJECT_ID y los tipos de objetos, visite: SYS.Objects
IF OBJECT_ID('SPNAME') IS NULL
-- Does Not Exists
ELSE
-- Exists
Tengo un proceso almacenado que permite al cliente extender la validación, si existe no quiero cambiarlo, si no es así, quiero crearlo, la mejor manera que he encontrado:
IF OBJECT_ID('ValidateRequestPost') IS NULL
BEGIN
EXEC ('CREATE PROCEDURE ValidateRequestPost
@RequestNo VARCHAR(30),
@ErrorStates VARCHAR(255) OUTPUT
AS
BEGIN
SELECT @ErrorStates = @ErrorStates
END')
END
El siguiente código verificará si el procedimiento almacenado ya existe o no.
Si existe, se alterará, si no existe, creará un nuevo procedimiento almacenado para usted:
//syntax for Create and Alter Proc
DECLARE @Create NVARCHAR(200) = 'Create PROCEDURE sp_cp_test';
DECLARE @Alter NVARCHAR(200) ='Alter PROCEDURE sp_cp_test';
//Actual Procedure
DECLARE @Proc NVARCHAR(200)= ' AS BEGIN select ''sh'' END';
//Checking For Sp
IF EXISTS (SELECT *
FROM sysobjects
WHERE id = Object_id('[dbo].[sp_cp_test]')
AND Objectproperty(id, 'IsProcedure') = 1
AND xtype = 'p'
AND NAME = 'sp_cp_test')
BEGIN
SET @Proc=@Alter + @Proc
EXEC (@proc)
END
ELSE
BEGIN
SET @Proc=@Create + @Proc
EXEC (@proc)
END
go