0

の後の変数を使用して、新しく作成されIDENTITYたテーブルを取得するのが一般的な方法です。@@IDENTITYINSERT

値を使用して同様の方法で最後のrowversion値を取得することは正しいですか?UPDATE@@DBTS

例えば:

IF(OBJECT_ID('XXX') IS NOT NULL)
    DROP TABLE XXX
GO
CREATE TABLE XXX
(
    ID int IDENTITY(1,1) PRIMARY KEY,
    Name varchar(64) NOT NULL,
    RV rowversion
)
GO
INSERT INTO XXX(Name) VALUES 
    ('Apples'),('Bananas'),('Cranberries'),('Dragon Fruit'),('Eggplant'),('Fig'),('Grape')
GO
SELECT * FROM XXX
GO
UPDATE XXX
    SET Name = 'Chocolate' WHERE ID = 3
PRINT @@DBTS
GO

@@DBTS同時更新から安全になりましたか ?

UPDATE別の接続がと の間で挿入と更新を実行する場合PRINTrowversion自分の更新からの接続ではなく、「他の」接続の になりますか?

4

1 に答える 1

0

MSDNによると@@DBTS

現在のデータベースの最後に使用されたタイムスタンプ値を返します

これは、スレッドセーフではないことを意味します。

も使用しないでください@@IDENTITY。現在のセッションの任意のテーブルで生成された最後の ID 値@@IDENTITYを返します。SCOPE_IDENTITYただし、SCOPE_IDENTITY現在のスコープ内でのみ値を返します。@@IDENTITY特定の範囲に限定されません。@@IDENTITYたとえば、id 列を持つテーブルでトリガーが実行されると、間違った値が返される可能性があります。

于 2015-04-29T10:38:05.153 に答える