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

bal*_*_88 1 sql sql-server ssms sql-server-2008

我有一个表,如果没有特定的键,我必须插入数据.我决定编写一个存储过程来插入数据.我想做的是:

  1. 创建存储过程.
  2. 使用存储过程插入一堆行.
  3. 删除存储过程.

我想在一个脚本文件中完成所有这些操作,以便没有人知道存在的过程存在.

这是我有的:

创建

CREATE PROCEDURE My_Proc(@key varchar(10))
  AS
  BEGIN
  IF NOT EXISTS (SELECT * FROM [dbo].[My_Table] WHERE [key] = @key)
    INSERT INTO [dbo].[My_Table] (key, created, modified)
    VALUES (@key, CURRENT_TIMESTAMP, CURRENT_TIMESTAMP)
  END
Run Code Online (Sandbox Code Playgroud)

插入

EXECUTE My_Proc 99241
GO
EXECUTE My_Proc 99242
GO
EXECUTE My_Proc 99243
GO
Run Code Online (Sandbox Code Playgroud)

下降

DROP PROCEDURE My_Proc
Run Code Online (Sandbox Code Playgroud)

现在我在SQL Server Management Studio中右键单击我的数据库,单击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).
Run Code Online (Sandbox Code Playgroud)

我无法弄清楚导致错误的原因.此外,当我EXECUTE在SSMS上突出显示特定命令时EXECUTE My_Proc 99241,数据插入时没有任何错误.

Ted*_*ott 5

创建过程后需要GO.我相信第一个"EXECUTE My_Proc 99241"作为程序的一部分被包含在内,因为缺少GO,所以基本上你有一个递归调用.

创建过程语句(以及函数和类似语句)将所有内容都带到批处理的末尾,这就是为什么它们必须后跟"GO"或文件结尾.