0

私は、SQL Server 2008 を使用しています。ストアド プロシージャは、テーブルにいくつかの値を挿入し、挿入された値を返します。nvarchar主キーとして使用しています。したがって、最後に挿入された値を選択するためにscopeidentity()関数を使用していますが、問題は値を挿入しているが、最後に挿入された値を返していないことです。コードは次のとおりです。

CREATE PROCEDURE cms_AddOwnerSession
@sessionId nvarchar(max),
@ownerId int,
@ownerName nvarchar(50),
@username nvarchar(30),
@password nvarchar(30)

AS
BEGIN

IF(@sessionId <> NULL)
    BEGIN
        INSERT INTO OwnerSession
        (SessionId,
        OwnerId,
        OwnerName,
        Username,
        [Password])
        VALUES
        (@sessionId,
        @ownerId,
        @ownerName,
        @username,
        @password)
        SET @sessionId = SCOPE_IDENTITY()
    END
    SELECT
        ISNULL (SessionId,'NULL')   'sessionId',
        ISNULL (OwnerId,0)          'ownerId',
        ISNULL (OwnerName,'')       'ownerName',
        ISNULL (Username,'')        'username',
        ISNULL ([Password],'')      'password' 
    FROM OwnerSession
    WHERE SessionId = @sessionId
END
GO
4

3 に答える 3

2

SCOPE_IDENTITYIDENTITY最後に生成された列の値を返します。あなた自身が提供するデータとは何の関係もありません。最初の列と一致せず、名前に「ID」が含まれる最初の列とも一致しません。(ここでの誤解はそのうちの1つだと思います)。

于 2013-07-28T09:58:01.333 に答える
1

行を挿入したプロシージャの範囲外の値にアクセスしようとしているため、列scope_identity()を使用した場合でも、コンテキストでは機能しません。プロシージャ内に挿入された値を確実に取得するには、同じステートメント内、または値が使用されているIDENTITY場合は少なくとも同じプロシージャ内に記録する必要があります。IDENTITY

あなたの場合、提供された値を取得して呼び出し元に返すか、OUTPUT句を使用してそれを行うことができます。

IDENTITY関連するさまざまな機能の紹介と欠点については、 http ://sqlity.net/en/351/identity-crisis/ を参照してください。

OUTPUTその記事では、条項を使用してこれらすべての不足に対処する 方法も示しています。

ただし、挿入が終了し、その実行中に値をキャプチャしなかった場合、使用した方法に関係なく、後で正しい値を取得できるという保証はないことを常に覚えておいてください。

于 2013-07-28T11:05:50.727 に答える
1

scope_identity()は、スコープ内で生成された最後のIDENTITY値を返します。あなたSessionIdはアイデンティティではありません。scope_identity()、@@identity、および IDENT_CURRENT の値には
十分注意してください。

@@IDENTITY、SCOPE_IDENTITY、および IDENT_CURRENT はすべて、テーブルの IDENTITY 列に挿入された最後の値を返すため、同様の関数です。

@@IDENTITY と SCOPE_IDENTITY は、現在のセッションの任意のテーブルで生成された最後の ID 値を返します。ただし、SCOPE_IDENTITY は現在のスコープ内でのみ値を返します。@@IDENTITY は特定のスコープに限定されません。

IDENT_CURRENT はスコープとセッションによって制限されません。指定されたテーブルに限定されます。IDENT_CURRENT は、任意のセッションおよび任意のスコープで特定のテーブルに対して生成された ID 値を返します。

于 2013-07-28T10:05:43.840 に答える