【问题标题】:Unable to call stored procedure within stored procedure无法在存储过程中调用存储过程
【发布时间】:2013-12-18 08:32:11
【问题描述】:

我有三个存储过程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 吗?
  • 我需要派生条件,这就是为什么需要在A内部调用B和C。
  • 您是否尝试过使用小写的dbo,因为排序规则可能区分大小写?
  • 我明白这一点。只是在测试方面确定你可以调用程序
  • @Kane 我也试过了。但没有结果

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


【解决方案1】:

您当然可以在单个 SP 中执行多个过程。您甚至可以将 1 个 SP 的结果作为另一个 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]

【讨论】:

    【解决方案2】:

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

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

    例如 - 使用“XYZ”。

    【讨论】:

      猜你喜欢
      • 2013-11-23
      • 2012-06-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-24
      相关资源
      最近更新 更多