1

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

  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

插入

EXECUTE My_Proc 99241
GO
EXECUTE My_Proc 99242
GO
EXECUTE My_Proc 99243
GO

降低

DROP PROCEDURE My_Proc

现在我在 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).

我无法弄清楚导致错误的原因。此外,当我突出显示EXECUTESSMS 上的特定命令时EXECUTE My_Proc 99241,数据会被插入而不会出现任何错误。

4

3 回答 3

5

在创建过程之后您需要一个 GO。我相信由于缺少 GO,第一个“EXECUTE My_Proc 99241”被包含在过程中,所以基本上你有一个递归调用。

Create Procedure 语句(以及函数和类似语句)将所有内容带到批处理的末尾,这就是为什么它们必须后跟“GO”或文件末尾的原因。

于 2012-10-03T17:57:41.390 回答
1

如果您有一个键列表,其中一些可能在表中,请尝试以下操作:

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)    
于 2012-10-03T17:50:17.317 回答
0

您要插入的表上是否有触发器?因为您要插入的表似乎存在某种循环。正在中断的函数/过程的名称不是您创建的过程的名称。注意错误信息:

(1 行受影响)

(1 行受影响)
消息 217,级别 16,状态 1,过程 InsertProfessionalComponentLookupForCpt,第 9 行
超出最大存储过程、函数、触发器或视图嵌套级别(限制 32)。

(1 行受影响)
消息 217,级别 16,状态 1,过程 InsertProfessionalComponentLookupForCpt,第 9 行
超出最大存储过程、函数、触发器或视图嵌套级别(限制 32)。

确保没有任何触发器或计算列在此表上做一些额外的工作。

于 2012-10-03T19:35:38.017 回答