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

时间:2014-12-08 11:49:29

标签: 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]

2 个答案:

答案 0 :(得分:3)

根据Bob Beauchemin here,存储过程的优先顺序是:

  • 查看' sys'模式
  • 查看程序的架构
  • 查看dbo架构

当订单为:

时,这与批处理或动态sql不同
  • 查看' sys'模式
  • 查看用户默认架构
  • 查看dbo架构

答案 1 :(得分:1)

删除s1.TestTable表后,它将默认为dbo,因为您没有在proc中的架构中指定。如果更改proc以从s1.gettesttable中的s1.TestTable中进行选择,则会出现错误