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输入模式名的原因——这是通常的默认模式
它对我不知道的东西的顺序是什么——默认还是当前优先——但这应该很容易测试。谢谢!我做了一个快速测试,发现它首先在引用对象的模式中查找,然后(仅当引用对象的模式中不存在该名称的对象时)在默认模式中查找。