6

TSQLトランザクション内には、レコードをに挿入する操作と、レコードの列の値でMyTable1更新する操作があります。これは、トランザクションがコミットされた後にのみ挿入されます。では、実際にテーブルに挿入される前に、この自動生成された値を取得するにはどうすればよいでしょうか。MyTable2IdentityMyTable1

質問を説明するためだけにコーディングします。

CREATE TABLE MyTable1(
MyTable1Id int identity(1,1) primary key,
Field1 varchar(50)
) 

CREATE TABLE MyTable2(
MyTable2Id int identity(1,1) primary key,
MyTable1Id int
)


CREATE PROCEDURE MyProc(
   @MyVal1  [varchar](50)
)
AS
BEGIN TRAN
-- try to insert
INSERT INTO MyTable1(
   Field1
)
SELECT @MyVal1

IF @@ERROR <> 0
BEGIN
  ROLLBACK TRAN
END

-- update MyTable2
DECLARE @TheUnknownIdValue int
UPDATE MyTable2
SET    MyTable1Id = @TheUnknownIdValue -- how to get the value needed here?
WHERE ...

IF @@ERROR <> 0
BEGIN
  ROLLBACK TRAN
END

COMMIT TRAN 
4

3 に答える 3

10

SCOPE_IDENTITY() 直後に使用INSERT

--
DECLARE @newId INT 
INSERT INTO MyTable1(
   Field1
)
SELECT @MyVal1
--End of Insert here
SELECT @newId = SCOPE_IDENTITY()
--Rest of the procedure
于 2012-12-03T12:57:21.580 に答える
2

一度に1つのレコードを挿入する場合は、scope_identity()関数を使用できます。

set @TheUnknownIdValue = scope_identity()

MyTable1に挿入した直後にこれを行います。

複数の行を挿入する場合は、OUTPUT句を使用して、すべての新しいIDを作業テーブルに入れるのが最善の方法です。

于 2012-12-03T12:58:33.903 に答える
1

SQL Serverでは、最後に生成されたID値を提供するSCOPE_IDENTITY()を使用します

UPDATE MyTable2
SET    MyTable1Id = SCOPE_IDENTITY() -- how to get the value needed here
WHERE ...

最初の挿入が失敗した場合、おそらくすべてを中止する必要がありますか?SQLServerのTry/Catchを調べると、そこにいくつかの良いパターンが見つかります。

于 2012-12-03T12:57:21.143 に答える