存储过程中的 SQL 默认架构解析

Sim*_*onJ 4 sql-server stored-procedures

在 MS SQL (2008 R2) 中,我凭经验发现,在以下 SQL 中,存储过程从定义该过程的同一架构中的表中返回数据,但如果没有这样的架构,则将默认返回到用户的默认架构被发现。
虽然这看起来很合乎逻辑,但是否有人有章节介绍 MSSQL 在访问存储过程中的非完全限定表时使用模式解析的优先顺序?

假设当前用户将 dbo 作为默认架构。

CREATE SCHEMA [s1]
GO
CREATE TABLE [dbo].[TestTable] ([Id] INT)
GO
CREATE TABLE [s1].[TestTable] ([AnotherId] INT)
GO

CREATE PROCEDURE [dbo].[GetTestTable]
AS BEGIN
    SELECT * FROM [TestTable]
END
GO
CREATE PROCEDURE [s1].[GetTestTable]
AS BEGIN
    SELECT * FROM [TestTable]
END
GO

EXEC [dbo].[GetTestTable]
-- Returns [Id]

EXEC [s1].[GetTestTable]
-- Returns [AnotherId]

DROP TABLE [s1].[TestTable]
GO

EXEC [s1].[GetTestTable]
-- Returns [Id]
Run Code Online (Sandbox Code Playgroud)

Ste*_*ord 5

根据 Bob Beauchemin 的说法存储过程的优先顺序是:

  • 查看“sys”架构
  • 查看您的程序的架构
  • 查看 dbo 架构

当顺序为以下情况时,这与批处理或动态 SQL 不同:

  • 查看“sys”架构
  • 查看用户默认架构
  • 查看 dbo 架构