TSQL运行时模式绑定

TSQL运行时模式绑定,sql,sql-server,tsql,dependencies,Sql,Sql Server,Tsql,Dependencies,我正试图通过sys.sql\u expression\u dependencies跟踪对象关系来为数据库构建依赖关系树(或者,如果这是实现这一点的唯一方法,我可以使用sys.dm\u sql\u referenced\u enties) 我注意到,对于某些被引用对象,我得到的是被引用的\u实体\u名称,而不是被引用的\u架构\u名称,或者(关键的是)被引用的\u id。查看Microsoft在上的页面,我发现当“引用实体的架构依赖于调用方的架构并在运行时解析”时,这些列可以为空。查看引用存储过程

我正试图通过
sys.sql\u expression\u dependencies
跟踪对象关系来为数据库构建依赖关系树(或者,如果这是实现这一点的唯一方法,我可以使用
sys.dm\u sql\u referenced\u enties

我注意到,对于某些被引用对象,我得到的是
被引用的\u实体\u名称
,而不是
被引用的\u架构\u名称
,或者(关键的是)被引用的\u id。查看Microsoft在上的页面,我发现当“引用实体的架构依赖于调用方的架构并在运行时解析”时,这些列可以为空。查看引用存储过程,我发现它将引用对象简单地引用为
MyObject
,而不是
dbo.MyObject
。(几乎所有的数据库都在dbo模式中,所以有些人(包括我自己)有时懒散地忽略了包含显式模式引用)。我尝试将过程定义更改为显式引用
dbo.MyObject
,然后再次查看
sys.sql\u expression\u dependencies
,我确实看到了以前缺少的
引用的\u schema\u name
引用的\u id


目前,我无法修复数据库中的所有对象,以便它们通过模式显式地进行所有引用。因此,我的问题是:如果Microsoft页面上说“引用实体的架构取决于调用方的架构,并在运行时解析”,这是否意味着SQL引擎将始终推断引用对象的架构与引用对象的架构相同?如果是这样,我可以使用
MyReferencedObjectSchema
+
MyReferencedObjectSchema
查找引用对象的
对象id
,并继续构建树。还是比那更复杂?

恐怕比那更复杂。它还将在连接的默认模式中查找具有正确名称的对象。这就是为什么通常不必为dbo输入模式名的原因——这是通常的默认模式


它对我不知道的东西的顺序是什么——默认还是当前优先——但这应该很容易测试。

谢谢!我做了一个快速测试,发现它首先在引用对象的模式中查找,然后(仅当引用对象的模式中不存在该名称的对象时)在默认模式中查找。