无法在存储过程中调用存储过程

时间:2013-12-18 08:32:12

标签: sql stored-procedures sql-server-2012 azure-sql-database

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

和A的定义类似

StoredProcedure A
As 
Begin

--Some Stuff

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

END

但每当我尝试执行存储过程A时,在解析时它会给出waring;

  

模块'A'取决于丢失的对象'B'。该模块仍将创建;   但是,在对象存在之前,它无法成功运行   模块“A”取决于缺失的对象“C”。该模块仍将创建;   但是,在对象存在之前,它无法成功运行。

在执行时它会抛出异常

  

无法找到存储过程'dbo.B'   找不到存储过程'dbo.C'。

我在存储过程中调用存储过程找到了很多答案,但是没有一个能为我工作。

2 个答案:

答案 0 :(得分:2)

您当然可以在单个SP中执行多个过程。您甚至可以将1 SP的结果作为另一个参数。

在您的具体情况下,我怀疑存在权限/安全性或排序规则错误,导致您无法访问BC存储的过程。

以下是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]

答案 1 :(得分:0)

也许听起来很有趣,但是由于我使用了错误的数据库名称(例如,使用'XYZ'),所以出现了上述问题。实际上,在我的情况下,我正在将SP从一个环境转移到另一个环境,但是这样做之后,我不会更改相应的数据库名称。由于涉及的SP存在于不同的数据库中,因此我遇到了错误环境。

简而言之,请检查数据库名称,它应该是SP的第一行。

例如-使用“ XYZ”。