Sql server 从不同数据库调用标量值函数

Sql server 从不同数据库调用标量值函数,sql-server,function,Sql Server,Function,我在DB1中有标量值函数 函数使用:Udf\u NumberToInfo(Number) 返回:所需号码的信息 我有DB1中的表 第1列:编号 第2列:信息 我在DB2中有数字,希望在DB2中查询它们并按它们分组。让我用示例查询来解释 USE DB2 select DB1..dbo.Udf_NumberToInfo(Number) as INFO,COUNT(*) as count from NumberTable (nolock) where Numbers like '5%' group b

我在DB1中有标量值函数

函数使用
Udf\u NumberToInfo(Number)

返回:所需号码的信息

我有DB1中的表

第1列:编号
第2列:信息

我在DB2中有数字,希望在DB2中查询它们并按它们分组。让我用示例查询来解释

USE DB2
select DB1..dbo.Udf_NumberToInfo(Number) as INFO,COUNT(*) as count from NumberTable (nolock)
where Numbers like '5%'
group by DB1..dbo.Udf_NumberToInfo(Number)
查询返回:

Remote function reference 'DB1..dbo.Udf_NumberToInfo' is not allowed, and the column name 'DB1' could not be found or is ambiguous.
如何在DB1中使用远程标量值函数


谢谢。

它应该可以工作,因为您使用的是db1..dbo它应该是db1.dbo 我在本地的机器上测试了它。 看看这个

USE DB2
select DB1.dbo.Udf_NumberToInfo(Number) as INFO,COUNT(*) as count from 
NumberTable (nolock)
where Numbers like '5%'
group by DB1.dbo.Udf_NumberToInfo(Number)

SQL Server中的双点表示法意味着:使用当前用户的默认模式(或默认数据库)

使用
DBName..myFunction
意味着:
DBName
数据库中用户默认模式中的
myFunction
函数。默认情况下,默认模式是dbo,但可以对其进行更改

假设userA的默认模式是
cust
模式,userB的默认模式是
dbo
模式。在这种情况下,当userA执行
DBName..myFunction
函数时,它将指向
DBName.cust.myFunction
,但当userB执行它时,它将指向
DBName.dbo.myFunction

在您的例子中,
DB1..dbo.Udf\u NumberToInfo
意味着:在用户的默认数据库和名为dbo的模式中,在名为DB1的链接服务器上使用Udf\u NumberToInfo函数

假设DB1和DB2托管在同一台服务器上,那么应该使用
DB1.dbo.Udf\u NumberToInfo


有关标识符的更多信息,请阅读MSDN上的以下文章:

难道您不能在DB2中创建Udf\u NumberToInfo标量函数吗?您知道将NOLOCK放入查询中会带来的所有挑战吗?缺少行和/或重复行是否可以?如果是这样,您至少需要使用正确的语法和WITH关键字。省略它已经被弃用了,将来您将不得不使用它。我建议删除标量函数将是最好的方法。标量函数的性能是出了名的差,它们使用中性能最差的方法是列列表。最好使用内联表值函数。这意味着一个select语句,而不是多个语句。后者更糟糕。
按DB1.dbo.Udf\u NumberToInfo(Number)
?不,它将按DB1.dbo.Udf\u NumberToInfo(Number)分组。我的问题是为什么
(2点)??。。(2点)允许您访问默认模式,但在脚本中您已经指定了模式名,即dbo,因此它将是dbname.schemaname.objectname或dbname..objectname(用于默认模式)