2010-05-21 113 views
1

我正在VisualParadigm中開發一個簡單的數據庫體系結構,最近運行了下一個代碼摘錄。SQL Server存儲過程含義

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

下一頁轉到我的存儲過程:

CREATE PROCEDURE getType @typeId int 
AS 
SELECT * FROM type t WHERE t.type_id = @typeId; 

誰能解釋這是什麼意思/做(前者)?

P.S .:這很好,如果你也可以檢查任何語法錯誤,因爲我完全不熟悉SQL Server和存儲過程。

回答

2

IF EXISTS部分首先檢查是否存在具有相同名稱的存儲過程。如果是這樣,它會在創建之前將其刪除。沒有這個檢查,你會得到一個存儲過程已經存在的錯誤。

+0

對不起,但很明顯。內部選擇部分呢?這是什麼sys.objects? – 2010-05-21 18:46:05

+2

對不起,這是顯而易見的。 Sys.objects是一個包含所有對象的系統表。我懇請您參考您可信的SQL Server文檔(嘗試它),也可從http://msdn.microsoft.com/en-us/library/ms190324.aspx獲得 - 解釋sys.objects。 – TomTom 2010-05-21 18:47:59

+0

我如何接受評論作爲正確的答案(而不是隻對其投票)? :) – 2010-05-21 19:15:21

0

看起來這是生成數據庫的腳本的一部分。第一條語句會查看您的存儲過程稱爲「getType」是否存在。如果確實如此,那麼它會放棄它。爲什麼?因爲下一行將創建它。

它可以創建它並確保它與當前版本的過程相匹配的唯一方法是將create更改爲alter。這將使更長的代碼,因爲它將不得不列出兩次sproc。或者它可以生成動態的SQL,它幾乎沒有那麼幹淨。

0

它做了刪除並重新創建

如果調用getType的數據庫對象存在:

WHERE object_id = OBJECT_ID(N'getType') 

,這是一個存儲過程:

AND type in (N'P', N'PC')) 

再加入之前砸你存儲過程:

DROP PROCEDURE getType; 
1

a CREATE PROCEDURE getType...如果對象已經存在將會失敗。通過包含IF EXISTS...代碼,如果該代碼首先存在,將刪除該對象,則會消除該錯誤並運行CREATE...

OBJECT_ID(N'getType')只返回名爲N'getType'的對象的數字ID,AND type in (N'P', N'PC'))確保該對象是P =存儲過程或PC = Assembly(CLR)。

你可以嘗試使用這樣的事情,所以你可以使用ALTER保持權限(DROP + CREATE刪除所有):

BEGIN TRY EXEC ('CREATE PROCEDURE YourProcedureName AS SELECT ''ERROR'' RETURN 999') END TRY BEGIN CATCH END CATCH 
GO 
ALTER PROCEDURE YourProcedureName 
AS 
SELECT 'WORKS!2' 
GO 

EXEC YourProcedureName 

OUTPUT:

------- 
WORKS!2 

(1 row(s) affected) 
0

第一個查詢下降過程,如果它存在。第二個創建一個採用整型參數並返回結果集的新過程。

1

添加到Raj的帖子中,沒有辦法使用存儲過程執行「upsert」。創建過程語句必須是該批次的第一個語句。因此,下面的工作:

If Not Exists(Select 1 From sys.procedures Where Name = 'getType') 
    Create Procedure... 
Else 
    Alter Procedure... 

的唯一手段,以「更新」的程序,而不必如果它已經存在就是放棄它並重新創建它,它拋出一個錯誤。

加成

爲了解決你在意見中提出一個具體的問題,sys.objects中是包含所有對象(表,約束列,索引等,每個「事情」的列表中的目錄視圖數據庫)其中的程序就是其中之一。因此,這是檢查過程對象(基於類型的過濾器)是否存在。 sys.objects表/視圖的主鍵是object_id,它是一個整數。在你的例子中,他們使用OBJECT_ID函數來查找對象getType的id並確定它是否是一個過程。 (它可能只是使用If OBJECT_ID(N'getType') is not null是安全的,但爲了防止另一個具有該名稱的對象不是一個過程,他們添加了對象類型的檢查)。