2009-07-16 10 views
5

EDIT: tworzenie funkcji brakowało, przykro o tymJak sprawdzić istnienie obiektu serwera sql i go usunąć?

mam prośbę T-SQL, który mówi:

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

Oczywiście jeśli uruchomię go dwukrotnie uzyskać

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

Jak zrobić coś takiego:

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

Jeśli dwukrotnie zadeklaruję @IsSomething, otrzymuję: "Nazwa zmiennej" @IsSomething "została już zadeklarowana. Nazwy zmiennych muszą być niepowtarzalne w ramach wsadowego zapytania lub procedury składowanej. " Czy niedopasowanie warunku/odpowiedzi było tylko przykładem? Jeśli tak, to może wyjaśnić, dlaczego ludzie uważają to pytanie za nieco mylące ... –

+0

Wszystko to - oprócz nazw zmiennych - jest dokładnie tym, co zrobiłem/błędom, które dostałem. Nieco dalej mam też "SET @IsSomething = 1", dodam to do pytania: – marcgg

+0

@IsSomething nie jest obiektem bazy danych; jest to zmienna T-SQL. Jeśli wystąpił błąd dotyczący istniejącego obiektu, ten obiekt został utworzony za pomocą CREATE [table | zobacz indeks | itp.] oświadczenie, a nie DECLARE. –

Odpowiedz

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

Część upuszczająca nie działa. Jeśli moja zmienna jest zadeklarowana w następujący sposób: DECLARE @IsSomething bit, jak mam ją upuścić? – marcgg

+0

edytowane w celu odzwierciedlenia rzeczywistości. pamiętać, że nie korzystać z IF object_id („YourObject”, „ObjectsType”) nie jest NULL styl, ponieważ jest zbyt niechlujny i spadnie inne typy obiektów nie może być przeznaczony. –

+1

Jak to, Chris? (W mojej odpowiedzi, na przykład.) –

0

Wydaje się analogiczne do każdego innego języka, w którym próbujesz wielokrotnie deklarować tę samą zmienną globalną. Zwykle nie piszemy:

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

wydaje mi się po prostu trzeba mieć świadomość struktury kodu piszesz.

Nie uważałbym zadeklarowanej zmiennej za "obiekt bazy danych", BTW. Ale twoje pytanie ma więcej sensu, jeśli z jakiegoś powodu to robisz.

+0

Jest to skrypt, który użyłem do aktualizacji bazy danych i tam mogą istnieć wcześniej istniejące rzeczy, więc muszę je upuścić. Dość powszechne jest to w przypadku tabel, więc dlaczego nie z tym? Nie jestem pewien co do języka "obiektu bazy danych", przepraszam, jeśli wprowadzał w błąd – marcgg

+0

Instrukcja "zdefiniuj" ma określony ograniczony zakres.Zdefiniowana zmienna nie powinna przeoczyć wykonania pojedynczego skryptu ani interakcji z innymi skryptami, chyba że zostanie wywołana jako indeks dolny. – dkretz

+0

Chodzi o to, że dodaje coś do bazy danych, więc powinno tam pozostać. Nie chcę tego stracić. – marcgg

1

Ci się to

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

Tak. Ponieważ A) "" należy zastąpić nazwą typu obiektu, np. "DROP TABLE [..]" lub "DROP INDEX [..], a B)" bit "nie jest typem obiektu, to jest typ domeny i nie możesz ich upuszczać – RBarryYoung

+1

Ach, widzę, zmieniłeś pytanie tak, aby było jasne, że próbujesz usunąć zmienną. Nie możesz tego zrobić, musisz rozpocząć kolejną sesję/batch (w skryptach GO to zrobi) – RBarryYoung

4

odpowiedź na edytowanym pytanie brzmi:

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

Szablon z Visual Studio 2008 Add -> Stored Procedure Script jest

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

procedurę , Sql Server Ma nagement Studio daje następujący skrypt do spadku

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] 

podobnie dla Function to wygenerowany skrypt jest

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] 

ja przeważnie widać te ostatnie formy (wersja 2-line) w większości codebases mam pracował nad i nie ma potrzeby deklarowania zmiennej.

Powiązane problemy