【发布时间】:2012-01-01 22:46:33
【问题描述】:
我正在尝试将实际调用 SQL# CLR 函数 RegEx_IsMatch 的用户定义函数添加到列中,但出现此错误:
在此上下文中,用户定义的函数名称不能以数据库名称作为前缀。
但如果函数在不同的数据库中,我不知道该怎么做。
【问题讨论】:
标签: sql-server-2008 user-defined-functions sqlclr check-constraints
我正在尝试将实际调用 SQL# CLR 函数 RegEx_IsMatch 的用户定义函数添加到列中,但出现此错误:
在此上下文中,用户定义的函数名称不能以数据库名称作为前缀。
但如果函数在不同的数据库中,我不知道该怎么做。
【问题讨论】:
标签: sql-server-2008 user-defined-functions sqlclr check-constraints
您不需要在CHECK CONSTRAINT 中执行此操作。 AFTER INSERT, UPDATE 触发器应该能够提供与CHECK CONSTRAINT 相同的功能。如果满足(或不满足)所需条件,您只需取消INSERT 或UPDATE 操作。这很容易通过发出ROLLBACK 来完成,这是由于DML 语句本身的事务中存在触发器而起作用的。因此,只需按照以下方式做一些事情:
CREATE TRIGGER dbo.trCheckSomeField
ON dbo.SomeTable
AFTER INSERT, UPDATE
AS
SET NOCOUNT ON;
IF (EXISTS(
SELECT *
FROM Inserted ins
WHERE Utility.SQL#.RegEx_IsMatch(ins.SomeField, ...) = 0
)
)
BEGIN;
ROLLBACK TRAN;
RAISERROR('Your data suck!', 16, 1);
RETURN;
END;
【讨论】:
从未尝试过,但也许您可以在同一个数据库中创建一个辅助函数,然后调用另一个数据库?
这可能会失败,因为检查约束应该是确定性的 AFAIR,而对其他数据库的调用不是确定性的。一般来说,调用另一个数据库似乎不是一个好主意,即使它只是用于正则表达式检查。为什么不将 CLR 程序集也添加到此数据库中?
【讨论】: