2016-08-11 10 views
1

ここにSQL n00b。私が間違っていることは何か考えていますか?うまくいけば、私は何をしようとしているのか理解することができます。最後に挿入された行のIDに等しい一時変数を作成する方法

DECLARE @CatId INT; 
SET @CatId = (
    INSERT INTO Categories (CategoryName) VALUES ('TestCategory'); 
    SELECT SCOPE_IDENTITY() 
); 
INSERT INTO Fields (CategoryID,FieldName,DisplayName) VALUES (@CatId,'TestName','TestDisplayName'); 

私はあなたも、このための変数を必要としないではない、非常に、詳細なエラーに

付近に正しくない構文「挿入」

+0

クエリに「IMPORT」はありません – Lamak

+1

このような変数は設定できません。 –

+0

一時テーブルまたはテーブル変数にOUTPUTを挿入します。特に、設定された操作が1レコード以上になる場合があります。 – Matt

答えて

1

を取得しています。 KISSプリンシパルを覚えています。

INSERT INTO Categories (CategoryName) VALUES ('TestCategory'); 
INSERT INTO Fields (CategoryID,FieldName,DisplayName) VALUES (SCOPE_IDENTITY(),'TestName','TestDisplayName'); 
0

あなたは次にINSERT

INSERT INTO Fields (CategoryID, FieldName, DisplayName) VALUES (@CatId,'TestName','TestDisplayName'); 

IDENT_CURRENTは、任意のセッションおよび任意の範囲内の特定のテーブルに対して生成された最後のID値を返すに@CatIdを再利用IDENT_CURRENT

DECLARE @CatId INT 
SELECT @CatId = IDENT_CURRENT('Categories') 

を使用することができます。

あなたはそれだけでは、SQL ServerではSCOPE_IDENTITY

+0

潜在的な並行性の問題があります。 –

+0

@SeanLange複数のセッションに問題がある場合、OPは 'SCOPE_IDENTITY'を使用できます –

+0

あなたのコードは常に複数のセッションを処理できるべきです。このようにIDENT_CURRENTを使用すると、競合状態が作成されます。何が問題になる可能性があるものを使用するのですか? SCOPE_IDENTITYを使用するだけで、それを修飾する必要はありません。 –

3

を使用することができ、あなたのセッションにスコープする必要がある場合は、これを処理するための正しい方法はOUTPUT句です。この方法を学び、それに固執することをお勧めします。

DECLARE @CatIds TABLE (catid int); 

INSERT INTO Categories (CategoryName) 
    OUTPUT inserted.catid INTO @CatIds; 
    VALUES ('TestCategory'); 

INSERT INTO Fields(CategoryID, FieldName, DisplayName) 
    SELECT CatId, 'TestName', 'TestDisplayName' 
    FROM @CatIds; 

それが明示的次いでさらに処理することができるテーブルに所望の情報を取得ので、これは他の方法よりも好ましいです。コードを「間に」追加して既存のコードを破る危険性がないため、コードはより堅牢です。同時に複数の値の挿入もサポートしています。

関連する問題