SQL Server存储过程中的意外递归调用
我有一个表,如果某个键不存在,我必须在其中插入数据。我决定编写一个存储过程来插入数据。我想做的是: 创建一个存储过程。 使用存储过程插入一组行。 删除存储过程。 我想在一个脚本文件中完成所有这些,这样就不会有人知道存储过程的存在 以下是我所拥有的: 创造 插入 下降 现在,我在SQLServerManagementStudio中右键单击我的数据库,单击New Query并粘贴上面的查询。我得到以下输出:SQL Server存储过程中的意外递归调用,sql,sql-server,sql-server-2008,ssms,Sql,Sql Server,Sql Server 2008,Ssms,我有一个表,如果某个键不存在,我必须在其中插入数据。我决定编写一个存储过程来插入数据。我想做的是: 创建一个存储过程。 使用存储过程插入一组行。 删除存储过程。 我想在一个脚本文件中完成所有这些,这样就不会有人知道存储过程的存在 以下是我所拥有的: 创造 插入 下降 现在,我在SQLServerManagementStudio中右键单击我的数据库,单击New Query并粘贴上面的查询。我得到以下输出: (1 row(s) affected) (1 row(s) affected) Msg 2
(1 row(s) affected)
(1 row(s) affected)
Msg 217, Level 16, State 1, Procedure My_Proc, Line 9
Maximum stored procedure, function, trigger, or view nesting level exceeded (limit 32).
(1 row(s) affected)
Msg 217, Level 16, State 1, Procedure My_Proc, Line 9
Maximum stored procedure, function, trigger, or view nesting level exceeded (limit 32).
我无法找出错误的原因。此外,当我在SSM上突出显示特定的EXECUTE命令(如so EXECUTE My_Proc 99241)时,插入的数据没有任何错误 如果您有一个键列表,其中一些键可能在表中,请尝试以下操作:
insert into my_tableC(key, created, modified)
select key, CURRENT_TIMESTAMP, CURRENT_TIMESTAMP
from <list of keys query> k
where k.key not in (select key from my_table)
如果您有列表,但不在表中,则可以将其创建为:
with toinsert as (
select <keyval1> as key union all
select <keyval2> union all
select <keyval3> . . .
select <keyvaln>
)
insert into my_tableC(key, created, modified)
select key, CURRENT_TIMESTAMP, CURRENT_TIMESTAMP
from toinsert k
where k.key not in (select key from my_table)
如果您有一个键列表,其中一些键可能在表中,请尝试以下操作:
insert into my_tableC(key, created, modified)
select key, CURRENT_TIMESTAMP, CURRENT_TIMESTAMP
from <list of keys query> k
where k.key not in (select key from my_table)
如果您有列表,但不在表中,则可以将其创建为:
with toinsert as (
select <keyval1> as key union all
select <keyval2> union all
select <keyval3> . . .
select <keyvaln>
)
insert into my_tableC(key, created, modified)
select key, CURRENT_TIMESTAMP, CURRENT_TIMESTAMP
from toinsert k
where k.key not in (select key from my_table)
您需要在创建过程之后进行一次尝试。我相信第一次执行My_Proc 99241将作为过程的一部分,因为缺少GO,所以基本上您有一个递归调用
Create Procedure语句以及函数和类似语句将所有内容都带到批处理的末尾,这就是为什么它们后面必须跟着GO或end of the file。在Create Procedure之后需要GO。我相信第一次执行My_Proc 99241将作为过程的一部分,因为缺少GO,所以基本上您有一个递归调用
Create Procedure语句以及函数和类似语句将所有内容都带到批处理的末尾,这就是为什么它们后面必须跟着GO或end文件。要插入的表上是否有触发器?因为您插入的表似乎存在某种循环。正在中断的函数/过程的名称不是您创建的过程的名称。请注意错误消息: (1 row(s) affected) (1 row(s) affected) Msg 217, Level 16, State 1, Procedure InsertProfessionalComponentLookupForCpt, Line 9 Maximum stored procedure, function, trigger, or view nesting level exceeded (limit 32). (1 row(s) affected) Msg 217, Level 16, State 1, Procedure InsertProfessionalComponentLookupForCpt, Line 9 Maximum stored procedure, function, trigger, or view nesting level exceeded (limit 32).
确保没有任何触发器或计算列在此表上执行额外的工作。要插入的表上是否有触发器?因为您插入的表似乎存在某种循环。正在中断的函数/过程的名称不是您创建的过程的名称。请注意错误消息: (1 row(s) affected) (1 row(s) affected) Msg 217, Level 16, State 1, Procedure InsertProfessionalComponentLookupForCpt, Line 9 Maximum stored procedure, function, trigger, or view nesting level exceeded (limit 32). (1 row(s) affected) Msg 217, Level 16, State 1, Procedure InsertProfessionalComponentLookupForCpt, Line 9 Maximum stored procedure, function, trigger, or view nesting level exceeded (limit 32).
请确保没有任何触发器或计算列在此表上执行额外工作。查看“合并”可在一次操作中完成整个集合。查看“合并”可在一次操作中完成整个集合。对不起。在发布问题之前,我更改了过程的名称,但粘贴了原始过程的错误。将编辑错误消息。此表上没有触发器/计算列。谢谢你指出这一点,我很抱歉。在发布问题之前,我更改了过程的名称,但粘贴了原始过程的错误。将编辑错误消息。此表上没有触发器/计算列。谢谢你指出这一点。这似乎是更好的选择。谢谢。与使用存储进程相比,这似乎是更好的选择。谢谢。与使用存储过程不同。