无法在存储过程内调用另一个存储过程

6
我是一名有用的助手,可以为您翻译文本。

我有三个存储过程 A、B、C

A 的定义如下:

StoredProcedure A
As 
Begin

--Some Stuff

Exec DBO.B [Derived Conitions]
Exec DBO.C [Derived Conitions]

END

但每当我尝试执行存储过程A时,在解析时它会给出警告;
模块'A'依赖于缺失的对象'B'。该模块仍将被创建; 但是,在对象存在之前,它无法成功运行。 模块'A'依赖于缺失的对象'C'。该模块仍将被创建; 但是,在对象存在之前,它无法成功运行。
在执行时它会抛出异常
找不到存储过程'dbo.B'。 找不到存储过程'dbo.C'。
我找到了很多关于在存储过程中调用存储过程的答案,但没有一个适用于我。

如果你尝试在存储过程A之外执行程序,一切都没问题吗?你确定存储过程B和C的所有者是dbo吗? - vkamayiannis
我需要派生条件,这就是在A中调用B和C的原因。 - user3030097
我明白这个。只是为了测试,以确保您可以调用过程。 - vkamayiannis
请确保dbo.B和dbo.C存储过程在您的数据库中存在。根据第二个错误,它们的定义不存在于您的数据库中。我建议您刷新数据库并执行命令sp_helptext dbo.B,以确保B和C存储过程仅存在于DBO模式中。 - Deepshikha
你的问题不在于调用过程,而在于它们的存在;消息“找不到存储过程”表明在创建A时尝试创建B和C时它们还不存在。 - Rikalous
显示剩余3条评论
2个回答

3

您可以在单个存储过程中执行多个过程。您甚至可以使用一个存储过程的结果作为另一个存储过程的参数。

在您的特定情况下,我怀疑权限/安全性或排序错误会阻止您访问B和C存储过程。

以下是SP链接工作的示例。

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE [dbo].[DerivedProcedures]
AS
BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;

    -- Temporary table used to store results from SP1
    DECLARE @Results_ForStoredProcedure1 TABLE 
    (
        [SPID] INT, 
        [Status] NVARCHAR(50), 
        [Login] NVARCHAR(50), 
        [HostName] NVARCHAR(50), 
        [BlkBy] NVARCHAR(5), 
        [DBName] NVARCHAR(50),
        [Commad]  NVARCHAR(50),
        [CPUTime] INT, 
        [DiskIO] INT,
        [LastBatch] NVARCHAR(50),
        [ProgramName] NVARCHAR(50),
        [SPID2] INT,
        [RequestId] INT
    )

    -- Execute SP1
    INSERT INTO @Results_ForStoredProcedure1 
    EXEC sp_who2

    -- Temporary table to store the results from SP2
    DECLARE @Results_ForStoredProcedure2 TABLE 
    (
        [DatabaseName] NVARCHAR(50),
        [DatabaseSize] INT,
        [Remarks] NVARCHAR(50)
    )

    -- Execute SP2
    INSERT INTO @Results_ForStoredProcedure2
    EXEC sp_databases 

    -- do something with both SP results
    SELECT DISTINCT SP2.* 
    FROM @Results_ForStoredProcedure1 AS SP1
        INNER JOIN @Results_ForStoredProcedure2 AS SP2 ON SP2.DatabaseName = SP1.DBName
    WHERE SP1.DBName IS NOT NULL



END
GO

-- TEST
EXECUTE [dbo].[DerivedProcedures]

2
也许听起来很滑稽,但我遇到了所提到的问题,因为我使用了错误的数据库名称(例如-使用“XYZ”)。实际上,在我的情况下,我正在从一个环境转移SP到另一个环境,但在这样做后,我没有更改相应的数据库名称。由于涉及的SP存在于不同的数据库中,因此我会遇到错误,因为它们存在于不同的环境中。
简而言之,请检查应该是SP第一行的DB名称。
例如-使用“XYZ”。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接