2013-03-23 16 views
5

Vorrei semplicemente inviare alcune informazioni da un semplice client a un file di registro e quindi utilizzare l'identità creata per un'ulteriore elaborazione.Uso corretto della funzione SCOPE_IDENTITY all'interno della stored procedure semplice

corretto è il seguente utilizzo di 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

Ho modificato il codice al seguente:

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

Sembra OK. Ci sono molti modi per farlo - usando il valore di ritorno, usando un parametro 'output'. – Oded

+0

Quali sono le tue preoccupazioni specifiche con questo? – Oded

+0

Sto costruendo la mia prima applicazione client-server da qui la domanda di base. Questo proc sarà la prima cosa da eseguire e l'ID verrà quindi passato lungo la linea, ovvero l'ID tornerà al client e poi verrà trasferito in altre 3 o 4 stored procedure. – whytheq

risposta

25

Sembra che questo è l'approccio migliore - possono vedere alcuni riferimenti consigliando di usare solo RETURN come modo di comunicare stato o errori quindi un parametro OUTPUT è una pratica migliore:

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

È inoltre possibile utilizzare SCOPE_IDENTITY in due prospetti separati, come ad esempio:

Supponendo che la tabella ha un campo di identità, naturalmente

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

Poi utilizzare la funzione SCOPE_IDENTITY() nella clausola Where, come :

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

Pertanto, scope_identity è un collegamento affidabile al record just inse ari.

Problemi correlati