2013-03-23 7 views
5

シンプルなクライアントからログファイルに情報を送信して、後で処理するために作成したIDを使用したいと考えています。単純なストアドプロシージャ内でSCOPE_IDENTITY関数を正しく使用する

SCOPE_IDENTITY()の使用は正しいですか?

CREATE PROCEDURE [dbo].[LogSearch] 
    @userName  VARCHAR(50), 
    @dateTimeStart DATETIME   
AS 
BEGIN 
SET NOCOUNT ON; 


    INSERT INTO [WH].[dbo].[tb_Searches] 
      (
      [UserName], 
      [DateTimeStart] 
      ) 
    SELECT @userName, 
     @dateTimeStart; 

    SELECT SCOPE_IDENTITY() AS ProfileKey; 

END; 

EDIT

私は、次のコードを編集した:これが最善のアプローチであるように

ALTER PROCEDURE [dbo].[LogSearch] 
    @userName VARCHAR(50), 
    @dateTimeStart DATETIME 
AS 
BEGIN 
    SET NOCOUNT ON; 

    INSERT INTO [WH].[dbo].[tb_Searches] 
      (
      [UserName],[DateTimeStart] 
      ) 
    VALUES (@userName, @dateTimeStart); 

    RETURN SCOPE_IDENTITY(); 

END; 
+0

見た目はOKです。これを行うには、 'output'パラメータを使って戻り値を使う方法がたくさんあります。 – Oded

+0

これに関する具体的な懸念事項は何ですか? – Oded

+0

私は最初のクライアント/サーバアプリケーションを構築しているので、基本的な質問です。このプロシージャは実行する最初のものであり、IDはその行に渡されます。つまり、IDはクライアントに戻って3つまたは4つの他のストアドプロシージャに渡されます。 – whytheq

答えて

25

は思える - としてのみRETURNを使用するように助言し、いくつかの文献を参照することができます状態やエラーを伝える方法は、OUTPUTパラメータが良い方針です。

ALTER PROCEDURE [dbo].[LogSearch] 
    @userName  VARCHAR(50), 
    @dateTimeStart DATETIME, 
    @searchID  INT OUTPUT 
AS 
BEGIN 
    SET NOCOUNT ON; 

    INSERT INTO [WH].[dbo].[tb_Searches] 
       (
       UserName, 
       DateTimeStart 
       ) 
    VALUES 
       (
       @userName, 
       @dateTimeStart 
       ); 

    SET @searchID = SCOPE_IDENTITY(); 

END; 
0同様に、 Where句で機能 SCOPE_IDENTITY()を使用

Insert into [ABCTable] 
([A], [B]) 
select 'WhateverA', 'WhateverB' 

その後表はもちろんのアイデンティティフィールドを持っていると仮定すると

3

また、例えば2つの別々のステートメントでSCOPE_IDENTITYを使用することができます:

Update [ABCTable] Set [A] = 'UpdateA', [B] = 'UpdateB' 
Where IdentityField = SCOPE_IDENTITY() 

このように、scope_identityは単なるinseのレコードへの信頼できるリンクです落ち着いた。

関連する問題