2009-04-13 69 views

回答

7

檢查過程中存在的標準方法是

if exists(
    SELECT * FROM INFORMATION_SCHEMA.ROUTINES 
    WHERE routine_type = N'PROCEDURE' and routine_name = @procname) 
    print 'exists' 

與MSSQL 2005開始,您可以使用[DDL觸發器(http://msdn.microsoft.com/en-us/library/ms190989(SQL.90%29.aspx)當程序被刪除或創建發送電子郵件通知:

USE msdb 
GO 
CREATE TABLE ddl_log 
(ID int idenity(1,1) PRIMARY KEY CLUSTERED, 
PostTime datetime, 
DB_User nvarchar(100), 
Event nvarchar(100), 
TSQL nvarchar(2000)); 

CREATE TRIGGER DDL_Notify 
ON DATABASE 
FOR DROP_PROCEDURE, CREATE_PROCEDURE 
AS 
DECLARE @data XML, 
     @tableHTML NVARCHAR(MAX) ; 

SET @data = EVENTDATA() 

INSERT msdb.dbo.ddl_log (PostTime, DB_User, Event, TSQL) 
VALUES (GETDATE(), CONVERT(nvarchar(100), USER_NAME()), 
    @data.value('(/EVENT_INSTANCE/EventType)[1]', 'nvarchar(100)'), 
    @data.value('(/EVENT_INSTANCE/TSQLCommand)[1]', 'nvarchar(2000)')) ; 

SET @tableHTML = 
    N'<H1>DDL Table Event</H1>' + 
    N'<table border="1">' + 
    N'<tr><th>Post Time</th><th>User</th>' + 
    N'<th>TSQL</th><th></tr>' + 
    CAST ((SELECT td = PostTime, '', 
        td = DB_User, '', 
        td = TSQL, '' 
       FROM msdb.dbo.ddl_log 
       WHERE id = (select max(id) from msdb.dbo.ddl_log) 
       FOR XML PATH('tr'), TYPE 
    ) AS NVARCHAR(MAX)) + 
    N'</table>'; 

EXEC msdb.dbo.sp_send_dbmail 
    @profile_name = 'Default', 
    @recipients = '[email protected]', 
    @subject = 'DDL Table Event', 
    @body = @tableHTML, 
    @body_format = 'HTML' 
+0

+1漂亮,我喜歡它:) – 2009-04-13 12:34:05

+0

+1偏好「INFORMATION_SCHEMA.ROUTINES」在舊的「系統對象」 – Sung 2009-04-14 03:38:27

0

快速和骯髒的方法是做到:

sp_helptext的proc_name中

如果函數抱怨,然後存儲過程丟失。

如果您想以編程方式查找,請在sysobjects表上執行查詢。

2
if not exists(select * from sysobjects where type='P' and name= @procedure_name) 
    print 'does not exist' 
0

如果您確實想知道「何時」刪除了您的程序,請查找DDL triggers(SQL 2005及更高版本)。

3

如果你想或多或少數據庫廠商無關,你可以使用SQL標準目錄視圖名爲INFORMATION_SCHEMA - 他們在SQL Server,MySQL和許多其他的系統來實現:

select * from INFORMATION_SCHEMA.ROUTINES 
where ROUTINE_NAME = 'YourStoredProcName' 

如果您取回一行,存儲的proc仍然在系統中 - 如果沒有,它就不存在了。

馬克

1

以上的答案是正確的,但我從來不明白爲什麼經驗豐富的DBA的不包括架構名稱。 下面顯示SCHEMA和區分大小寫的更正。

IF NOT EXISTS 
    (
    SELECT * FROM INFORMATION_SCHEMA.ROUTINES 
    WHERE ROUTINE_TYPE = N'PROCEDURE' and ROUTINE_SCHEMA = N'dbo' and ROUTINE_NAME = N'uspMyProcedure' 
    ) 
BEGIN 
    print 'Does not exist' 
END 

..

架構討論Microsoft.com上

http://msdn.microsoft.com/en-us/library/dd283095%28v=sql.100%29.aspx

..

至於最佳做法 「是否存在」 ......我也要使用TSQL通過Andy Leonard的5部分系列(以及不斷髮展)的測試驅動開發。

http://www.sqlservercentral.com/articles/Testing/66553/

相關問題