0

scope_identity() を使用したこのマルチテーブル挿入 (ストアド プロシージャ) が機能しない理由がわかりません。これが要点です (ここでの想像を絶するネーミングを許してください):

ここに画像の説明を入力

TableB の RowID 列は明らかに int であり、ID の自動インクリメントなどとして設定されていません。

管理スタジオで実行すると、1行が影響を受けたと表示されますが、挿入は行われません。

コードから実行すると、TableB の RowID に NULL 値を挿入できないというエラーが表示されますが、これは正しく、null でない制約があります。ただし、最初のテーブルから scope_identity() を取得する必要があります。

トランザクションの内外で、さまざまなパラメーターの初期化を試しました...それは私を殺しています。ご協力いただきありがとうございます。

4

3 に答える 3

1

ここに示したコードに問題はありません。サンプルを簡略化したときに、問題のあるコードを削除したと思います。

これを試して。

declare @TableA table (IDA int identity primary key, ColA int)
declare @TableB table (IDB int primary key, ColB int)

declare @RecordID int = 0,
        @Val1 int
        
if @RecordID = 0
  begin
    declare @NewID int

    insert into @TableA values (@Val1)
    set @NewID = scope_identity()

    insert into @TableB values (@NewID, @Val1)
  end
else
  begin
    print 'Do something else'
  end  

select *
from @TableA, @TableB

結果:

IDA         ColA        IDB         ColB
----------- ----------- ----------- -----------
1           NULL        1           NULL

自分でスピンしてみてください。https://data.stackexchange.com/stackoverflow/q/103697/using-scope-identity

于 2011-06-20T20:51:07.253 に答える
1

確認すべきもう 1 つのことは、テーブルにトリガー (特に INSTEAD OF トリガー) があり、レコードが挿入されない原因になっている可能性があるかどうかです。

@newId 変数を初期化して null か値があるかを確認した後、print ステートメントを追加してその値を確認できます。

明示的なトランザクションと try catch ブロックを使用してみてください。最初の挿入を通過しない場合、catch ブロックで発生しているエラーを確認できます。

于 2011-06-20T20:57:33.700 に答える
1

tableA には数値列に IDENTITY が設定されていると思いますか?

SCOPE_IDENTITY() がない場合は NULL になります

「影響を受ける1行」も、このINSERTからtableAへのものではありません。

于 2011-06-20T19:37:07.743 に答える