【问题标题】:Calling two levels of stored procedure调用两级存储过程
【发布时间】:2019-09-30 14:24:27
【问题描述】:

在 SQL Server 2014 中,我有两个存储过程。一个使用INSERT 命令调用另一个。

我想调用上层存储过程来获取它的结果表。但是,我收到一个错误:

消息 213,级别 16,状态 7,过程 HelloWorld,第 23 行
列名或提供的值的数量与表定义不匹配。

这是我完成的代码示例:

第一个存储过程:

ALTER PROCEDURE [dbo].[HelloWorld_2]
    @aaa VARCHAR(20)
AS
BEGIN
    SELECT 1 AS col1, @aaa AS col2
END

第二个存储过程(它调用第一个存储过程)

ALTER PROCEDURE [dbo].[HelloWorld]
    @aaa VARCHAR(20)
AS
BEGIN
    DECLARE @temp TABLE(col1 INT, col2 VARCHAR(20))

    INSERT INTO @temp
        EXEC [HelloWorld_2] @aaa

    SELECT *, 'patata' 
    FROM @temp
END

我需要执行的SQL(它调用第二个存储过程)

DECLARE @temp TABLE(col1 INT, col2 VARCHAR(20), col3 VARCHAR(20))

INSERT INTO @temp
    EXEC HelloWorld 3

返回值必须是一个包含 3 列和 1 行的表。但是出现了这个错误:

列名或提供的值的数量与表定义不匹配

但是临时表的列顺序和值是正确的...

【问题讨论】:

  • 我无法复制那个错误 (DB<>Fiddle),我得到了 Msg 8164 Level 16 State 1 Line 6 An INSERT EXEC statement cannot be nested.;你无法修复。这看起来像一个 XY 问题。
  • SQL 不是过程语言,所以像这样的调用堆栈充其量是有问题的。你想做什么?
  • @Brian,好吧,我正在尝试使用我已经创建的一些现有 SP。我们在生产中使用这两个 SP,所以我不想修改它们,也不想创建另一个 SP。
  • 好吧,正如@Larnu 所说,您遇到了 SQL Server 的限制。在这种情况下,我通常做的是在顶级过程中创建一个 #Temp 表 - 在你的情况下是 HellowWorld - 并利用它调用的过程 - 在你的情况下是 HelloWorld_2 - 可以看到它。但是,您必须大量记录这类事情

标签: sql-server stored-procedures


【解决方案1】:

感谢所有回复。

最后,我创建了一个'HelloWorld_2'的函数,这样存储过程'HelloWorld'和SQL代码就可以正常工作了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-14
    相关资源
    最近更新 更多