Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/86.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL Server存储过程中的意外递归调用_Sql_Sql Server_Sql Server 2008_Ssms - Fatal编程技术网

SQL Server存储过程中的意外递归调用

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

我有一个表,如果某个键不存在,我必须在其中插入数据。我决定编写一个存储过程来插入数据。我想做的是:

创建一个存储过程。 使用存储过程插入一组行。 删除存储过程。 我想在一个脚本文件中完成所有这些,这样就不会有人知道存储过程的存在

以下是我所拥有的:

创造

插入

下降

现在,我在SQLServerManagementStudio中右键单击我的数据库,单击New Query并粘贴上面的查询。我得到以下输出:

(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).
请确保没有任何触发器或计算列在此表上执行额外工作。

查看“合并”可在一次操作中完成整个集合。查看“合并”可在一次操作中完成整个集合。对不起。在发布问题之前,我更改了过程的名称,但粘贴了原始过程的错误。将编辑错误消息。此表上没有触发器/计算列。谢谢你指出这一点,我很抱歉。在发布问题之前,我更改了过程的名称,但粘贴了原始过程的错误。将编辑错误消息。此表上没有触发器/计算列。谢谢你指出这一点。这似乎是更好的选择。谢谢。与使用存储进程相比,这似乎是更好的选择。谢谢。与使用存储过程不同。