2010-11-18 24 views
1

我正在使用SQL Server 2005並在其中一個表中有一列存儲存儲的proc名稱。在該列中插入值時,我想確保數據庫中存在該名稱的存儲過程。添加一個約束,檢查是否存在proc

ALTER TABLE MyTable WITH CHECK 
    ADD CONSTRAINT [CK_MyTable_MyColumn] CHECK ((SELECT COUNT(*) FROM sys.sysobjects WHERE id = object_id(MyColumn) AND OBJECTPROPERTY(id, N'IsProcedure')=1) = 1) 

但這提供了以下錯誤

子查詢在此背景下 允許。只有標量表達式允許使用 。

我該怎麼做。

+0

如果您發佈的是代碼或XML,請**在文本編輯器中突出顯示這些行,然後單擊編輯器工具欄上的「代碼」按鈕(101 010),以良好地格式化和語法突出顯示它! – 2010-11-18 06:50:31

+0

作爲一個側面說明:我會使用sys.procedures而不是sys.sysobjects,首先,它更清楚你做了什麼,其次,你不必定義一個對象類型來檢查 - 它已經很清楚,它是一個你正在尋找的程序 – 2010-11-18 06:52:19

回答

4

功能允許:

create function dbo.IsProcedure(@ProcName sysname) returns bit as 
return (SELECT COUNT(*) FROM sys.sysobjects 
    where id = object_id(MyColumn) and OBJECTPROPERTY(id, N'IsProcedure')=1); 
go 

ALTER TABLE MyTable WITH CHECK ADD CONSTRAINT [CK_MyTable_MyColumn] 
CHECK (dbo.IsProcedure(MyColumn) = 1); 
2

注意,此類型的約束只能保證是真實的,在一個記錄被插入或更新的時間。 proc可以被丟棄而沒有任何後果。您可能需要添加DDL觸發器來捕獲表中引用的丟棄事件和/或定期運行的異常報告過程,以監視系統的運行狀況,以確保表中的任何過程實際存在。