2009-07-16 3 views
5

EDIT: Die Funktion Schöpfung ist, tut mir leid, dass ich eine T-SQL-AnfrageWie überprüfe ich das Vorhandensein eines SQL-Server-Objekts und lasse es fallen?

fehlt, das lautet:

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

Natürlich

wenn ich es zweimal ausführen ich

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

Wie würde ich etwas tun:

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

Wenn ich @IsSomething zweimal deklariere, bekomme ich: 'Der Variablenname' @IsSomething 'wurde bereits deklariert. Variablennamen müssen innerhalb eines Abfrage-Batches oder einer gespeicherten Prozedur eindeutig sein. ' Haben Sie die Bedingung/Antwort nur als Beispiel nicht berücksichtigt? Wenn ja, könnte es erklären, warum die Leute die Frage ein wenig verwirrend finden ... –

+0

All dies - abgesehen von Variablennamen - ist genau das, was ich gemacht habe/die Fehler, die ich bekommen habe. Ein bisschen weiter vorne habe ich auch ein "SET @IsSomething = 1", ich füge das zur Frage hinzu – marcgg

+0

@IsSomething ist kein Datenbankobjekt; es ist eine T-SQL-Variable. Wenn bei einem vorhandenen Objekt ein Fehler aufgetreten ist, wurde dieses Objekt mit CREATE [table | erstellt Ansicht | Index | etc] Aussage, nicht DECLARE. –

Antwort

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

der Drop-Teil funktioniert nicht. Wenn meine Variable wie folgt deklariert wird: DECLARE @IsSomething bit, wie soll ich es fallen lassen? – marcgg

+0

bearbeitet, um die Realität widerzuspiegeln. Beachten Sie, dass ich IF IF OBJECT_ID ('YourObject', 'ObjectsType') nicht NOT-Stil verwendet, weil es zu schlampig ist und andere Objekttypen fallen lassen würde, die Sie möglicherweise nicht beabsichtigt haben. –

+1

Wie ist das, Chris? (In meiner Antwort zum Beispiel.) –

0

Scheint analog zu jeder anderen Sprache, in der Sie versuchen, dieselbe globale Variable mehrmals zu deklarieren. Normalerweise schreiben wir nicht:

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

mir scheint, wie Sie gerade von der Struktur des Codes informiert werden muss, Sie schreiben.

Ich würde eine deklarierte Variable nicht als ein "Datenbank-Objekt", BTW. Aber Ihre Frage ergibt mehr Sinn, wenn Sie aus irgendeinem Grund tun.

+0

Es ist ein Skript, das ich verwendet habe, um eine Datenbank zu aktualisieren, und dort möglicherweise vorhandenes Zeug dort, also muss ich sie fallen lassen. Es ist ziemlich üblich, dies mit Tabellen zu tun, also warum nicht damit? Ich bin mir nicht sicher über die "Datenbank-Objekt" Sprache, tut mir leid, wenn es irreführend war – marcgg

+0

Eine "definieren" Anweisung hat einen spezifischen begrenzten Bereich.Eine definierte Variable sollte nicht die Ausführung eines einzelnen Skripts überstehen oder mit anderen Skripten interagieren, wenn sie nicht als Indizes aufgerufen werden. – dkretz

+0

Die Sache ist, dass es etwas in der Datenbank hinzufügt, also soll es dort bleiben. Ich will es nicht verlieren. – marcgg

1

Gefallen Sie diese

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

Ja. Weil A) "" durch den Namen des Objekttyps ersetzt werden muss, dh, "DROP TABLE [..]" oder "DROP INDEX [..], und B)" Bit "ist kein Objekttyp, es ist ein Domain-Typ und Sie können sie nicht fallen lassen. – RBarryYoung

+1

Ah, ich sehe jetzt, Sie haben Ihre Frage geändert, so dass es klar ist, dass Sie versuchen, eine Variable abzulegen. Sie können das nicht tun, müssen Sie eine andere Sitzung starten/Batch. (In Skripten wird GO dies tun) – RBarryYoung

4

die Antwort auf Ihre editierten Frage ist:

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

Die Vorlage, von Visual Studio 2008 Add -> Stored Procedure Script ist

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 
*/ 

ein Verfahren , SQL Server Ma nagement Studio gibt das folgende Skript

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] 

ebenfalls für eine Funktion Drop-Skript generiert wird ist

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] 

Ich habe meistens die letzteren Formen gesehen (2-line-Versionen) in den meisten Codebases Ich habe gearbeitet, und es besteht keine Notwendigkeit, eine Variable zu deklarieren.

Verwandte Themen