如何解决一个INSERT EXEC语句不能嵌套SQL错误?

时间:2017-05-15 08:58:38

标签: sql-server

我是一个存储过程。我试图在临时表中获得这些值。但我收到以下错误信息。

错误:

Msg 8164, Level 16, State 1, Procedure spLocal_MES_UnitOEE, Line 200
An INSERT EXEC statement cannot be nested.

这是我的SQL语句。

Declare @tempJanMonth_OEE table(CurrentStatusIcon int, UnitName Varchar(20), ProductionAmount float, AmountEngineeringUnits varchar(20), ActualSpeed float, IdealProductionAmount float, IdealSpeed float,
SpeedEngineeringUnits varchar(50), PerformanceRate float, WasteAmount int, QualityRate int, PerformanceTime varchar(20), RunTime varchar(20), LoadingTime varchar(20), AvailableRate float, PercentOEE float, HighAlarmCount int,
MediumAlarmCount int, LowAlarmCount int, UnitId varchar(200), CategoryID int, Production_Variable varchar(100), SummaryRow int);

Insert into @tempJanMonth_OEE
Exec spLocal_MES_UnitOEE '14;15;16;3;7;9;4;5;24;25;','2017-05-14 07:00:00 AM','2017-05-15 07:00:00 AM',1,NULL,1,NULL

Select * from @tempJanMonth_OEE

请帮助解决这个问题。

4 个答案:

答案 0 :(得分:0)

根据您的要求,我猜您应该在结果的存储过程中放置​​一个select查询,以便在执行时将其插入表中。我有一个例子,希望它能解决你的问题:

此过程接受输入,将值加1并选择结果如下

CREATE  PROCEDURE TEST
@VAL INT
AS  
BEGIN
DECLARE @NEW INT
SET @NEW=@VAL+1
SELECT @VAL,@NEW
END

现在我已经创建了一个临时表并插入了执行结果:

declare @temps table (ins int)
insert into @temps exec test '2'
insert into @temps exec test '3'
insert into @temps exec test '4'
insert into @temps exec test '5'

select * from @temps

结果是:

+---+---+
|ins|fin|
+---+---+
|2  |3  |
+---+---+
|3  |4  |
+---+---+
|4  |5  |
+---+---+
|5  |6  |
+---+---+

答案 1 :(得分:0)

如果您要查找的是proc输出到表中,我通常最终要做的是使用过程本身的代码定义,而不是执行SELECT,而您是' d将数据插入表中以进行进一步处理(例如,我对sp_spaceused的部分输出感兴趣,但是想对输出执行额外的计算,并省略一些列。但是,当尝试将输出存储到临时表或表变量中时,会弹出相同的错误消息。

为此,在SSMS中,展开数据库,然后展开可编程性文件夹,"存储过程",并找到有问题的过程。右键单击它,然后选择"修改"。这会将proc的定义编写到一个新的查询窗口,然后您可以将其更改为您的心脏'内容。

明显的缺点是,如果原始proc中的逻辑发生变化,则必须对新创建的逻辑进行第二次更新,因为您基本上只是复制了代码。

答案 2 :(得分:0)

如果您在网上搜索,您会找到相当复杂的解决方法的建议,例如:Errors: "INSERT EXEC statement cannot be nested." and "Cannot use the ROLLBACK statement within an INSERT-EXEC statement." How to solve this?

但简短的回答是否定的。也许这是一个很好的迹象,现在是时候审查当前的实施,看看它是否可以改进。

答案 3 :(得分:0)

如果您执行以下操作,那该怎么办:

Exec spLocal_MES_UnitOEE '14;15;16;3;7;9;4;5;24;25;','2017-05-14 07:00:00    AM','2017-05-15 07:00:00 AM',1,NULL,1,NULL

Insert into @tempJanMonth_OEE
select * from dbo.temp

drop table dbo.temp

程序spLocal_MES_UnitOEE,而不是

select *
from #result

确实

select *
into dbo.temp
from #result

我不太了解这个话题,但我认为它应该有效(这可能不是一个好的解决方案)。