2013-03-23 8 views
5

Ich möchte einfach einige Informationen von einem einfachen Client an eine Protokolldatei senden und dann die für die weitere Verarbeitung erstellte Identität verwenden.Korrekte Verwendung der Funktion SCOPE_IDENTITY in einer einfachen gespeicherten Prozedur

Ist die folgende Verwendung von SCOPE_IDENTITY() korrekt?

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

I-Code der folgenden bearbeitet haben:

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

Sieht OK aus. Es gibt viele Möglichkeiten, dies zu tun - indem Sie den Rückgabewert verwenden, indem Sie einen 'output' Parameter verwenden. – Oded

+0

Was sind Ihre speziellen Anliegen? – Oded

+0

Ich baue meine erste Client-Server-Anwendung daher die Grundfrage. Dieser Proc ist die erste Sache, die ausgeführt wird, und die ID wird dann in der Zeile weitergereicht, dh die ID wird zum Client zurückkommen und dann in 3 oder 4 andere gespeicherte Prozeduren übergeben. – whytheq

Antwort

25

Scheint, wie dies der beste Ansatz ist - kann ein paar Referenzen nur Beratung sehen RETURN als verwenden Art der Kommunikation Zustand oder Fehler so ein OUTPUT Parameter ist eine bessere Praxis:

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

Sie können auch SCOPE_IDENTITY in zwei separaten Anweisungen verwenden, wie zum Beispiel:

Unter der Annahme, dass die Tabelle ein Identitätsfeld natürlich die Funktion SCOPE_IDENTITY() in der Klausel Where

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

Dann hat verwenden, wie :

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

So ist die scope_identity eine zuverlässige Verbindung zum Datensatz gerade inse rted.

Verwandte Themen