2010-11-18 74 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触发器来捕获表中引用的丢弃事件和/或定期运行的异常报告过程,以监视系统的运行状况,以确保表中的任何过程实际存在。