2013-03-23 103 views
5

我只想簡單地將一些信息從簡單的客戶端發送到日誌文件,然後使用創建的標識進行進一步處理。正確使用簡單存儲過程中的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; 

編輯

我編輯的代碼爲以下:

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

看起來不錯。有很多方法可以做到這一點 - 使用返回值,使用'output'參數。 – Oded 2013-03-23 20:31:11

+0

你對此有什麼具體問題? – Oded 2013-03-23 20:32:54

+0

我正在構建我的第一個客戶端 - 服務器應用程序,因此是基本問題。這個過程將首先運行,然後ID將傳遞到該行,即ID將返回給客戶端,然後傳遞到3或4個其他存儲過程。 – whytheq 2013-03-23 20:33:16

回答

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; 
3

您還可以使用SCOPE_IDENTITY在兩個單獨的語句,如:

假設表具有當然的標識字段

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

然後使用功能SCOPE_IDENTITY()Where子句中,像:

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

因此,scope_identity是一個可靠的鏈接,記錄就是inse rted。

相關問題