如何 运行 来自另一个模式的模式过程

How to run a schema proc from another schema

假设在多模式数据库中我们有这两个过程:

Create proc S1004.proc1 
As
  Exec proc2
GO
Create proc S1004.proc2 
As
   Select 1

然后,当我尝试从 sa 登录 运行 proc1 时,sql 发出错误:找不到存储过程 'proc2'。

我知道如果我们在proc1 的body 中给proc2 添加schema,那么它就可以解析schema。

这个问题还有其他解决办法吗

如果您可以在用户 'scope' 中使用您的模式(请注意,用户和模式在 SQL 服务器中是分开的),您可以摆脱这个:

CREATE USER S1004 FOR LOGIN S1004 WITH DEFAULT_SCHEMA = S1004;
GO

CREATE PROCEDURE S1004.proc1 
WITH EXECUTE AS 'S1004'
AS
  EXECUTE proc2
GO

CREATE PROCEDURE S1004.proc2 
AS
   SELECT 1

EXEC S1004.proc1 

这里发生的是您使用同名的默认架构创建用户 S1004。当在当前架构范围内没有立即找到对象时,将在该架构中搜索对象。

当您需要在过程中解析架构时,您 运行 在该用户的上下文中执行该过程(请参阅 WITH EXECUTE AS 'S1004'),架构解析将会成功。

但是请注意,这会将执行范围更改为另一个用户。这是一种解决方法,但在这种情况下,这是您可以获得的最佳方法。