在计算列中使用另一个数据库中的函数
2022-02-24 00:00:00
user-defined-functions
calculated-columns
sql-server
sql-server-2008-r2
ddl-trigger
我在单个数据库中安装了一组自定义CLR函数。当我需要在另一个数据库的查询/视图/过程中使用这些函数时,我只需通过三部分名称
[db].[schema].[function]()
引用它们,它就可以很好地工作。
但是由于错误4120
A user-defined function name cannot be prefixed with a database name in this context
,我不能在计算列中使用它们。
当然,使用两部分名称[schema].[function]()
在同一数据库上添加计算列没有问题。
有没有办法解决这个问题?也许我可以在引用"原始"函数的每个其他数据库中创建某种"快捷"函数?或者,我是否可以像left()
或substring()
那样,将这些函数安装在一个系统数据库中,使我能够仅使用其名称调用函数?
model
db中也是如此。但我希望有更优雅的方式来做到这一点。
解决方案
没有比这更好的方法了。计算列不能依赖外部函数(即使您将其隐藏在synonym后面,这似乎是您想要的那种"快捷"函数)-问题是跨数据库关系不能破坏模式稳定性-当数据库脱机、SINGLE_USER或被删除时会发生什么?这类似于外键不能引用另一个数据库中的表,并且表不能属于另一个数据库中的架构的原因。
您已经知道不能使用由3部分组成的名称(在SQL Server 2014中,我收到不同的错误):
消息207,级别16,状态1
列名‘Other_database_name’无效。
如果尝试使用同义词屏蔽函数,则会收到:
消息2788,级别16,状态2
同义词在架构绑定对象或约束表达式中无效。
因此,请将您的函数部署到所有数据库,或者预计算值并手动插入和存储它们,而不是依赖于计算列。
相关文章