2009-07-16 13 views
5

EDITAR: la creación función faltaba, lo siento por esoCómo verificar la existencia de un objeto de servidor sql y soltarlo?

Tengo una petición T-SQL que va:

DECLARE @IsSomething bit 
SET @IsSomething = 0 
IF /some tests/ SET @IsSomething = 1 
EXEC(' 
CREATE FUNCTION IsSomething() 
RETURNS bit 
AS 
BEGIN 
    RETURN ' + @IsSomething + ' 
END') 

Por supuesto, si lo ejecuto dos veces consigo

There is already an object named 'IsSomething ' in the database. 

¿Cómo puedo hacer algo como esto:

IF EXIST @IsSomething DESTROY @IsSomething // (Pseudo bad code) 
+0

Si declaro @IsSomething dos veces, obtengo: 'El nombre de variable' @IsSomething 'ya ha sido declarado. Los nombres de las variables deben ser únicos dentro de un lote de consulta o un procedimiento almacenado. ' ¿Ignoraste la condición/respuesta solo como un ejemplo? Si es así, podría explicar por qué las personas encuentran la pregunta un poco confusa ... –

+0

Todo esto, aparte de los nombres de las variables, es exactamente lo que hice/los errores que obtuve. Un poco más adelante también tengo un "SET @IsSomething = 1", lo agregaré a la pregunta – marcgg

+0

@IsSomething no es un objeto de base de datos; es una variable T-SQL. Si recibió un error sobre un objeto existente, ese objeto se creó con un CREATE [tabla | ver | índice | etc] declaración, no DECLARAR. –

Respuesta

7
IF EXISTS (SELECT * FROM dbo.sysobjects WHERE id = object_id (N'[dbo].[IsSomething]') AND OBJECTPROPERTY(id, N'IsFunction') = 1) 

DROP function IsSomething 
GO 
+0

la gota no funciona. Si mi variable se declara así: DECLARE @IsSomething bit, ¿cómo debería descartarlo? – marcgg

+0

editado para reflejar la realidad. Tenga en cuenta que no utilicé el estilo SI OBJECT_ID ('YourObject', 'ObjectsType') IS NOT NULL porque es demasiado descuidado y arrojaría otros tipos de objetos que podría no haber pensado. –

+1

¿Cómo es eso, Chris? (En mi respuesta, por ejemplo.) –

0

Parece análogo a cualquier otro idioma en el que intente declarar la misma variable global varias veces. Normalmente no escribimos:

var a; 
a = 0; 
... 
... 
undefine a; 
a = 1; 
... 
... 
undefine a; 
a = 2; 

Me parece que sólo tiene que ser consciente de la estructura del código que está escribiendo.

No consideraría una variable declarada como un "objeto de base de datos", por cierto. Pero su pregunta tiene más sentido si por alguna razón lo hace.

+0

Es una secuencia de comandos que utilicé para actualizar una base de datos, y podría haber material preexistente allí, así que tengo que soltarlos. Es bastante común hacer esto con tablas, ¿por qué no con esto? No estoy seguro del lenguaje de "objeto de base de datos", lo siento si fue engañoso – marcgg

+0

Una declaración "define" tiene un alcance limitado específico.Una variable definida no debe sobrevivir a la ejecución de un solo script, ni interactuar con otros scripts a menos que se los llame como subíndices. – dkretz

+0

La cuestión es que está agregando algo en la base de datos, por lo que se supone que debe permanecer allí. No quiero perderlo. – marcgg

1

gusta esta

IF OBJECT_ID('YourObject', 'ObjectsType') IS NOT NULL DROP <ObjectsType> [YourObject] 
+0

Sí. Porque A) "" tiene que ser reemplazado con el nombre del tipo de objetos, es decir, "DROP TABLE [..]" o "DROP INDEX [..], y B)" bit "no es un tipo de objeto, es un tipo de dominio y no puede soltarlos. – RBarryYoung

+1

Ah, ya veo, ha cambiado su pregunta para que quede claro que está tratando de DROP una variable. No puede hacer eso, tiene que iniciar otra sesión/lote. (En los guiones, GO hará esto) – RBarryYoung

4

La respuesta a su pregunta editada es:

if object_id('IsSomething', 'fn') is not null drop function IsSomething 
go 
1

la plantilla, desde Visual Studio 2008 Add -> Stored Procedure Script es

IF EXISTS (SELECT * FROM sysobjects WHERE type = 'P' AND name = 'Stored_Procedure_Name') 
    BEGIN 
     DROP Procedure Stored_Procedure_Name 
    END 

GO 

CREATE Procedure Stored_Procedure_Name 
/* 
    (
     @parameter1 int = 5, 
     @parameter2 datatype OUTPUT 
    ) 

*/ 
AS 


GO 

/* 
GRANT EXEC ON Stored_Procedure_Name TO PUBLIC 

GO 
*/ 

para un procedimiento , Servidor Sql Ma nagement Estudio da la siguiente secuencia de comandos para colocar

IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[usp_DeleteXyz]') AND type in (N'P', N'PC')) 
DROP PROCEDURE [dbo].[usp_DeleteXyz] 

misma razón, una función que ha generado guión es

IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[udf_GetXyz]') AND type in (N'FN', N'IF', N'TF', N'FS', N'FT')) 
DROP FUNCTION [dbo].[udf_GetXyz] 

que he visto sobre todo las últimas formas (versiones de 2 líneas) en la mayoría de bases de código que he trabajó, y no hay necesidad de declarar una variable.

Cuestiones relacionadas