在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]
答案 0 :(得分:3)
根据Bob Beauchemin here,存储过程的优先顺序是:
当订单为:
时,这与批处理或动态sql不同答案 1 :(得分:1)
删除s1.TestTable表后,它将默认为dbo,因为您没有在proc中的架构中指定。如果更改proc以从s1.gettesttable中的s1.TestTable中进行选择,则会出现错误