2009-07-16 35 views
5

編輯:函數創建失蹤,有關如何檢查SQL Server對象的存在並刪除它?

對不起,我有去一個T-SQL請求:

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

當然,如果我跑了兩遍,我得到

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

我該怎麼做這樣的事情:

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

如果我聲明@IsSomething兩次,我會得到:'變量名'@IsSomething'已經被聲明。變量名稱在查詢批處理或存儲過程中必須是唯一的。'就像一個例子,你是否與條件/迴應不匹配?如果是這樣,這也許可以解釋爲什麼人們發現這個問題有點令人困惑...... – 2009-07-16 21:13:15

+0

所有這些 - 除了變量名稱 - 正是我所做的/我得到的錯誤。再進一步,我也有一個「SET @IsSomething = 1」,我將這個問題加入 – marcgg 2009-07-16 21:15:44

+0

@IsSomething不是數據庫對象;這是一個T-SQL變量。如果你有一個關於現存對象的錯誤,那個對象是用CREATE [table |創建的查看| index | etc]語句,而不是DECLARE。 – 2009-07-16 21:18:40

回答

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

似乎與您試圖多次聲明相同全局變量的任何其他語言類似。通常我們不寫:

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

對我來說似乎只是需要知道您正在編寫的代碼的結構。

我不會認爲一個聲明的變量是一個「數據庫對象」,順便說一句。但是如果出於某種原因你的問題更有意義。

1

喜歡這個

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

回答你編輯的問題是:

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

模板,從Visual Studio 2008 Add -> Stored Procedure Script

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

對於程序,Sql Server Ma nagement工作室提供了以下腳本,刪除

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] 

同樣爲它生成的腳本功能被

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] 

我大部分時間在大多數代碼庫我見過後者形式(2行版本)工作,並且不需要聲明變量。

相關問題