sql-server – 与表不同的存储过程的模式查找(bug?)

如果在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

你得到错误

Could not find stored procedure ‘ProcSub’

这使得无法将程序划分为模式而无需将模式硬编码到执行调用中.这是设计还是错误,因为在表格中首先查看表格中的选择.

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

我已经看过我是否可以用同义词来解决它,但它们似乎与它们有相同的问题.

最佳答案 这是设计使然,因为没有为调用该过程的用户设置默认模式.

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

查看:

Beginning with SQL Server 2005, each user has a default schema. The
default schema can be set and changed by using the DEFAULT_SCHEMA
option of CREATE USER or ALTER USER. If DEFAULT_SCHEMA is left
undefined, the database user will have dbo as its default schema.

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

点赞