1

特定のキーが存在しない場合にデータを挿入する必要があるテーブルがあります。データを挿入するためのストアドプロシージャを作成することにしました。私がやりたいことは:

  1. ストアドプロシージャを作成します。
  2. ストアドプロシージャを使用して、一連の行を挿入します。
  3. ストアドプロシージャを削除します。

ストアドプロシージャが存在することを誰も知らないように、これらすべてを1つのスクリプトファイルで実行したいと思います。

これが私が持っているものです:

作成

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

Createプロシージャの後に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 に答える