2

(すみません - 私は StackOverflow と SQL の両方に不慣れです) Tl;dr - @@identity(または scope_identity や出力変数などの他のオプション) を使用する場合、ビューも使用できますか? を使用したスト​​アド プロシージャの例を次に示します@@identity

--SNIP--
DECLARE @AID INT
DECLARE @BID INT


INSERT INTO dbo.A (oct1)
VALUES
(@oct1)

SELECT @AID = @@IDENTITY;

INSERT INTO dbo.B (duo1)
VALUES
(@duo2)

SELECT @BID = @@IDENTITY

INSERT INTO dbo.tblAB (AID, BID)
VALUES
(@AID, @BID)
GO

より長いです:

テーブルに挿入する場合、 を使用して ID シードの現在の値を取得できます@@identity。これは、テーブル A と B に挿入し、ID 値をキャプチャしてから、A と B を関連付けるテーブル AB に挿入する場合に便利です。明らかに、これはデータの正規化のためです。

データを扱いやすくするために、テーブルで内部結合を実行するいくつかで DB スキーマを抽象化するとします。その場合、どのように相互参照テーブルを適切に設定しますか? 同じ方法で行うことができますか?

4

2 に答える 2

5

厄介なバグがあるため、システムが並列プランを使用している場合は @@IDENTITY または SCOPE_IDENTITY() を使用しないでください。参照してください - http://connect.microsoft.com/SQL/feedback/ViewFeedback.aspx?FeedbackID=328811

挿入された ID ID を取得するより良い方法は、OUTPUT 句を使用することです。

CREATE TABLE tblTest
(         
    Sno         INT IDENTITY(1,1) NOT NULL,         
    FirstName   VARCHAR(20) 
)  

DECLARE @pk TABLE (ID INT)  

INSERT INTO tblTest(FirstName) 
OUTPUT INSERTED.Sno INTO @pk
SELECT 'sample' 

SELECT * FROM @pk 

編集:

ビューでも同様に機能します。以下のサンプルをご覧ください。これがあなたが探していたものであることを願っています。

CREATE VIEW v1
AS
SELECT sno, firstname FROM tbltest
GO

DECLARE @pk TABLE (ID INT)  

INSERT INTO v1(FirstName) 
OUTPUT INSERTED.Sno INTO @pk
SELECT 'sample' 

SELECT ID FROM @pk
于 2012-07-18T05:56:07.817 に答える
2

@@IDENTITY は、値を生成したテーブルや、値を生成したステートメントのスコープに関係なく、接続で最後に生成された IDENTITY 値を返します。

SCOPE_IDENTITY() は、値を生成したテーブルに関係なく、接続上および同じスコープ内のステートメントによって生成された最後の IDENTITY 値を返します。SCOPE_IDENTITY() は、@@IDENTITY と同様に、現在のセッションで作成された最後の ID 値を返しますが、現在のスコープにも制限されます。

これらのいずれかの問題は microsoft によって修正されていますが、「OUTPUT」を使用することをお勧めします。はい、ビューでも使用できます

于 2012-07-18T07:58:39.390 に答える