2009-05-06 3 views
2

In einer ähnlichen Ader wie meine previous question frage ich nochmal die SO Jungs nach deiner kollektiven Weisheit und Hilfe.Gib die ID der gerade hinzugefügten Zeile zurück.

In einer gespeicherten Prozedur und nachdem ich einige Prüfungen bestanden habe, muss ich eine neue Zeile einfügen und die neu erstellte ID zurückgeben. Die Überprüfung, ob eine Zeile existiert, funktioniert so, dass es das Bit ist, nach dem ich unentschlossen bin.

Die Tabelle enthält zwei wichtige Spalten: Die LocationID und die CaseID. Die CaseID wird automatisch inkrementiert. Wenn Sie also eine neue LocationId hinzufügen, wird sie automatisch erhöht.

Im Moment habe ich dies:

-- previous checks for existance of CaseID 

IF @CaseID IS NULL 
BEGIN 
    INSERT INTO 
     Cases(LocationID) 
    VALUES 
     (@LocationID) 

    -- what now? 
END 

Ich dachte an eine @CaseID = (SELECT blah) Aussage immeadiately nach der Durchführung, aber ich habe mich gefragt, ob es einen besseren Weg?

Gibt es einen besseren Weg? Wie würdest du das machen?

+0

Verwenden Sie SET @id = SCOPE_IDENTITY() und vergessen Sie über @@ IDENTITY. Wenn Sie Trigger in der Tabelle haben, die Identitätswerte generieren, gibt @@ IDENTITY diesen Identitätswert und nicht die ursprüngliche INSERTs-Identität zurück, aber SCOPE_IDENTITY() gibt die richtige Identität innerhalb des aktuellen Bereichs zurück. –

Antwort

4
SELECT @CaseID = SCOPE_IDENTITY() 

In der Tat, können Sie nur (wenn das das Ende der gespeicherte Prozedur ist.):

SELECT SCOPE_IDENTITY() 

(Die OUTPUT-Klausel ab in SQL Server 2005 nur verfügbar ist, ...)

Ref: SCOPE_IDENTITY

+0

Ich glaube nicht, dass das funktionieren würde, weil es so aussieht, als hätte er die CaseID bereits vorher eingefügt. Er fügt jetzt eine LocationID ein, daher gibt SCOPE_IDENTITY() die neu eingefügte LocationID und nicht die CaseID zurück. Ich könnte die Frage jedoch falsch verstehen. – Joseph

+0

Sie sind. Plakat sagte, dass CaseId die automatische Erhöhungspalte ist ... –

+0

Ok ich versuchte herauszufinden, warum er prüfte, ob @CaseID NULL war, bevor er die Einfügung tat, das machte mir nicht viel Sinn – Joseph

1

scope_identity()

+1

FYI, es gibt einen bekannten Fehler mit Scope_Identity() und @@ IDENTITY: https://connect.microsoft.com/SQLServer/feedback/ViewFeedback.aspx?FeedbackID=328811 –

+0

Ich bin gerade auf das @ IDENTITY-Makro (?) und implementierte es wie Brandon Reno sagte die meisten Leute würden es verwenden: SET @id = SCOPE_IDENTITY(), oder in meinem Fall SET @id = @@ IDENTITY –

+0

Danke für den Tipp, KM. Ich kannte diesen Fehler nicht. Hört sich an, als wären wir in Sicherheit, solange wir die VALUES-Klausel in der INSERT-Anweisung verwenden? –

1

Wie andere schon erwähnt, SCOPE_IDENTITY() ist der Weg zu gehen, obwohl einige ORM-Tools als auch diese Funktionalität bereitstellen.

Sie müssen sich nur daran erinnern, dass SCOPE_IDENTITY() den letzten Identitätsschlüsselwert zurückgibt, der nur während der aktuellen Sitzung generiert wurde. Dies ist nützlich, um neue Schlüssel herauszufiltern, die möglicherweise gleichzeitig von anderen Clients erstellt wurden. SELECT @@ IDENTITY gibt den letzten von einem Client/einer Sitzung generierten Schlüssel zurück.

+0

Danke Rich, das war mir nicht bewusst :-) – IrishChieftain