saber - verificar si existe una tabla en sql server
Cómo detectar si ya existe un procedimiento almacenado (10)
Tengo que escribir un script de despliegue que funcionará si existe un procedimiento almacenado o no existe. es decir, si existe, entonces necesito modificarlo, de lo contrario, crearlo.
¿Cómo puedo hacer esto en sql.
Estoy usando SQL Server 2005
Además de lo que ya se ha dicho, también me gusta agregar un enfoque diferente y defender el uso de la estrategia de implementación de script diferencial. En lugar de crear un script con estado que siempre verifica el estado actual y actúa en función de ese estado, impleméntelo a través de una serie de scripts sin estado que actualicen desde versiones bien conocidas . He utilizado esta estrategia y vale la pena, ya que mis scripts de implementación ahora son todos ''SI'' gratuitos.
Desde SQL Server 2016 CTP3
puede usar nuevas sentencias DIE en lugar de grandes contenedores IF
Sintaxis:
DROP {PROC | PROCEDIMIENTO} [SI EXISTE] {[nombre_esquema. ] procedimiento} [, ... n]
Consulta:
DROP PROCEDURE IF EXISTS usp_name
Más información here
EDITAR: no poner texto antes de bloques de código lo mata ... siempre lo olvides :)
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 xxx es el nombre del proceso
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
Estoy de acuerdo con Luke, pero una mejor opción podría ser utilizar una herramienta como Red-Gate SQL Compare o SQL Examiner para comparar automáticamente las diferencias y generar un script de migración.
La forma más limpia es probar su existencia, soltarla si existe y luego volver a crearla. No puede incrustar una instrucción "create proc" dentro de una instrucción IF. Esto debería hacer muy bien:
IF OBJECT_ID(''MySproc'', ''P'') IS NOT NULL
DROP PROC MySproc
GO
CREATE PROC MySproc
AS
BEGIN
...
END
Si ABANDONE y CREE 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 metadependientes sobrevivirán a la implementación.
Si solo está tratando con procedimientos almacenados, lo más fácil es probablemente dejar caer el proceso y luego volver a crearlo. Puede generar todo el código para hacer esto usando 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...
Tengo un proceso almacenado que permite al cliente extender la validación; si existe, no quiero cambiarla, si no es así, quiero crearla, de 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
IF OBJECT_ID(''SPNAME'') IS NULL
-- Does Not Exists
ELSE
-- Exists