在计算列中使用另一个数据库中的函数

我在单个数据库中安装了一组自定义CLR函数。当我需要在另一个数据库的查询/视图/过程中使用这些函数时,我只需通过三部分名称[db].[schema].[function]()引用它们,它就可以很好地工作。

但是由于错误4120A user-defined function name cannot be prefixed with a database name in this context,我不能在计算列中使用它们。

当然,使用两部分名称[schema].[function]()在同一数据库上添加计算列没有问题。

有没有办法解决这个问题?也许我可以在引用"原始"函数的每个其他数据库中创建某种"快捷"函数?或者,我是否可以像left()substring()那样,将这些函数安装在一个系统数据库中,使我能够仅使用其名称调用函数?

目前,我用来更新和安装新函数的脚本在我需要函数的每个数据库上执行相同的操作,在modeldb中也是如此。但我希望有更优雅的方式来做到这一点。


解决方案

没有比这更好的方法了。计算列不能依赖外部函数(即使您将其隐藏在synonym后面,这似乎是您想要的那种"快捷"函数)-问题是跨数据库关系不能破坏模式稳定性-当数据库脱机、SINGLE_USER或被删除时会发生什么?这类似于外键不能引用另一个数据库中的表,并且表不能属于另一个数据库中的架构的原因。

您已经知道不能使用由3部分组成的名称(在SQL Server 2014中,我收到不同的错误):

消息207,级别16,状态1
列名‘Other_database_name’无效。

如果尝试使用同义词屏蔽函数,则会收到:

消息2788,级别16,状态2
同义词在架构绑定对象或约束表达式中无效。

因此,请将您的函数部署到所有数据库,或者预计算值并手动插入和存储它们,而不是依赖于计算列。

相关文章