【发布时间】: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