与表不同的存储过程的模式查找(错误?)

时间:2016-03-23 12:07:58

标签: sql-server tsql stored-procedures

如果在sql server中运行以下内容......

CREATE SCHEMA [cp]
GO

CREATE TABLE [cp].[TestIt](
    [ID] [int] NULL
) ON [PRIMARY]
GO

CREATE PROCEDURE cp.ProcSub
AS
BEGIN
    Print 'Proc Sub'
END
GO

CREATE PROCEDURE cp.ProcMain
AS
BEGIN
    Print 'Proc Main'
    EXEC ProcSub
END
GO

CREATE PROCEDURE cp.ProcMain2
AS
BEGIN
    Print 'Proc Main2'
    SELECT * FROM TestIt
END
GO

exec cp.ProcMain2
GO

exec cp.ProcMain
GO

您收到错误

  

无法找到存储过程'ProcSub'

这使得在不将模式硬编码到执行调用中的情况下,无法将过程划分为模式。这是设计还是错误,因为在表格中首先查看表格中的选择。

如果有人有解决方法我会有兴趣听到它,虽然我的想法是我可以给开发人员两个存储过程相互调用并可以在他们的数据库中放入他们喜欢的任何模式他们可以运行,以便成为查看同一数据库中另一个给定模式的对象的实用程序。

我已经看过我是否可以使用同义词来解决这个问题,但他们似乎也遇到了与之相关的问题。

1 个答案:

答案 0 :(得分:2)

这是设计使然,因为没有为调用该过程的用户设置默认架构。

当在查询中未指定schema时,sql server将首先尝试默认模式,然后尝试dbo(如果不同)模式。因此,您需要设置默认架构或使用完全限定名称创建过程。

退房:

  

从SQL Server 2005开始,每个用户都有一个默认架构。该   可以使用DEFAULT_SCHEMA设置和更改默认架构   CREATE USER或ALTER USER选项。如果剩下DEFAULT_SCHEMA   未定义,数据库用户将dbo作为其默认架构。

https://technet.microsoft.com/en-us/library/ms190387%28v=sql.105%29.aspx