如何解决插入EXEC语句不能嵌套SQL错误?



I 一个存储过程。我试图在临时标签中获取此值。但是我收到以下错误消息。

错误:

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

你能帮忙解决这个问题吗?

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

为此,请在 SSMS 中展开数据库,然后展开可编程性文件夹"存储过程",并找到有问题的过程。右键单击它,然后选择"修改"。这会将 proc 的定义脚本编写到一个新的查询窗口,然后您可以在其中根据自己的喜好对其进行更改。

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

如果您搜索 Web,您会发现有关相当复杂的解决方法的建议 - 例如: 错误:"INSERT EXEC 语句无法嵌套"和"无法在 INSERT-EXEC 语句中使用 ROLLBACK 语句"。 如何解决这个问题?

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

如果你执行以下操作呢:

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

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

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

此过程接受输入,将 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  |
+---+---+

最新更新