私が代わりにトリガを使用してテーブルに挿入、@@Identity
、IDENT_CURRENT('Table')
およびSCOPE_IDENTITY()
リターンヌル。挿入された行の最後のIDを取得するにはどうすればよいですか?
私が代わりにトリガを使用してテーブルに挿入、@@Identity
、IDENT_CURRENT('Table')
およびSCOPE_IDENTITY()
リターンヌル。挿入された行の最後のIDを取得するにはどうすればよいですか?
回答:
INSTEAD_OFトリガーの場合、挿入はまだ発生していません。IDはまだ生成されていないため、識別できません。メタデータから値をこっそり取得することは可能ですが(DBCC CHECKIDENT
)、これに依存すると、同時実行では正しく機能せず、さらに高い特権が必要になります。
INSTEAD_OFトリガーが必要になることはほとんどなく、深刻なコードの臭いがします。本当に必要ですか?通常のAFTERトリガーで作業できませんか?
トリガーの代わりに、挿入された値を確実に取得できますが、挿入を実行するまでは取得できません。
USE tempdb;
GO
CREATE TABLE dbo.SmellThis
(
id INT IDENTITY(1,1),
name VARCHAR(32)
);
GO
CREATE TRIGGER dbo.SmellThis_First
ON dbo.SmellThis
INSTEAD OF INSERT
AS
BEGIN
SET NOCOUNT ON;
DECLARE @ids TABLE(id INT);
IF NOT EXISTS
(
SELECT 1 FROM sys.objects AS o
INNER JOIN inserted AS i
ON o.name = i.name
)
INSERT dbo.SmellThis(name)
OUTPUT inserted.id INTO @ids
SELECT name
FROM inserted;
SELECT id FROM @ids;
END
GO
INSERT dbo.SmellThis(name) SELECT 'Remus';
GO
結果:
id
----
1
次にクリーンアップします。
DROP TABLE dbo.SmellThis;
余談ですが、決して使用し@@IDENTITY
たり、使用したりしIDENT_CURRENT()
てはいけません。またSCOPE_IDENTITY
、挿入できる行が1つだけであることがわかっている場合のために予約してください。トリガーに関する一般的な誤解は、他のプラットフォームと同様に、行ごとに起動するが、SQL Serverでは操作ごとに起動するということです。VALUES(),(),()
つまり、or を使用した複数行挿入INSERT...SELECT
- SCOPE_IDENTITY
変数に設定するのはどれですか。
inserted
されたときに挿入される行はありませんINSTEAD OF
。