存储过程的架构名称解析

时间:2017-03-16 07:29:17

标签: sql-server

根据网上书籍(https://technet.microsoft.com/en-us/library/ms189915(v=sql.105).aspx),我们有:

在SQL Server中,如果当前架构包含具有指定名称的过程,则返回该过程。如果指定了非限定存储过程,则数据库引擎将按以下顺序搜索该过程:

•当前数据库的sys架构。

•调用者的默认模式,如果在批处理或动态SQL中执行;或者,如果非限定程序名称出现在另一个程序定义的正文中,则接下来将搜索包含此其他程序的模式。

•当前数据库中的dbo架构。

我尝试用一​​个调用proc2的存储过程Proc1来测试这个案例。我在同一模式中定义它们,但调用没有模式名称的proc2。它不起作用,那么上面列表中第二项的第二部分是什么意思呢?

Use AdventureWorks
GO

CREATE SCHEMA MySchema
GO

CREATE PROCEDURE MySchema.PROC2
AS
BEGIN
        SELECT 1
END
GO

CREATE PROCEDURE MySchema.PROC1
AS
BEGIN
        SELECT 2
        -- calling proc2 without schema name
        -- expecting it will work, since proc1 and proc2 are in same schema
        EXEC PROC2
END

GO

--calling proc1 (my default schema is dbo)
--Could not find stored procedure 'PROC2'.
EXEC MySchema.PROC1

我知道最佳做法是始终使用模式名称 - 我只是好奇第二项的含义。我在2016版本上测试了这个。

1 个答案:

答案 0 :(得分:1)

您链接的页面是特定系统存储过程的文档。它的含义仅限于此存储过程的作用。

CREATE PROCEDURE MySchema.PROC1
AS
BEGIN
        SELECT 2
        -- calling proc2 without schema name
        -- expecting it will work, since proc1 and proc2 are in same schema
        EXEC sp_stored_procedures 'PROC2'
END

生成2个结果集 - 第一个包含2,第二个包含有关MySchema.PROC2存储过程的信息。