2013-03-23 15 views
5

Chciałbym po prostu przesłać niektóre informacje z prostego klienta do pliku dziennika, a następnie użyć tożsamości utworzonej w celu dalszego przetwarzania.Prawidłowe użycie funkcji SCOPE_IDENTITY w prostej przechowywanej procedurze

Czy prawidłowe jest następujące użycie 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

Mam edytowany kod na następujący:

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

Wygląda OK. Można to zrobić na wiele sposobów - używając zwracanej wartości, używając parametru 'output'. – Oded

+0

Jakie są twoje szczególne problemy z tym związane? – Oded

+0

Buduję swoją pierwszą aplikację klient-serwer, stąd podstawowe pytanie. Ten proces będzie pierwszym zadaniem, a identyfikator zostanie przekazany dalej, tzn. Identyfikator wróci do klienta, a następnie zostanie przekazany do 3 lub 4 innych procedur przechowywanych. – whytheq

Odpowiedz

25

Wydaje się to najlepszym rozwiązaniem - można zobaczyć kilka odniesień doradza używać tylko RETURN jako sposób komunikowania stanu lub błędów, więc parametr OUTPUT jest lepszą praktyką:

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

Można również użyć SCOPE_IDENTITY w dwóch oddzielnych sprawozdaniach, takich jak:

Zakładając, że tabela zawiera pole tożsamości oczywiście

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

Następnie użyć funkcji SCOPE_IDENTITY() w klauzuli Where, jak :

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

Tak więc, scope_identity to wiarygodne połączenie z rekordem rted.

Powiązane problemy