{"id":237,"date":"2013-10-05T11:03:29","date_gmt":"2013-10-05T10:03:29","guid":{"rendered":"http:\/\/csopro.de\/biblog\/2013\/10\/scope_identity-statt-identity\/"},"modified":"2014-12-31T18:26:30","modified_gmt":"2014-12-31T17:26:30","slug":"scope_identity-statt-identity","status":"publish","type":"post","link":"https:\/\/www.csopro.de\/biblog\/2013\/10\/scope_identity-statt-identity\/","title":{"rendered":"Scope_Identity statt @@Identity"},"content":{"rendered":"<p>Beides sind Funktionen, um den Wert der Identity-Column nach dem Insert zu erhalten. Als ich SQL Server gelernt hatte (1997), hatte ich nur @@identity gekannt.<\/p>\n<p>@@Identity hat aber einen entscheidenden Nachteil, aber dazu sp\u00e4ter mehr.<\/p>\n<p>Nehmen wir an, wir haben eine Kunden-Tabelle mit Identity-Column KundeID:<\/p>\n<blockquote>\n<p>CREATE TABLE [dbo].[Kunden](     <br \/>&#160;&#160;&#160; [KundeID] [int] IDENTITY(1,1) NOT NULL,      <br \/>&#160;&#160;&#160; [Name] [nvarchar](50) NOT NULL,      <br \/> CONSTRAINT [PK_Kunden] PRIMARY KEY CLUSTERED       <br \/>(      <br \/>&#160;&#160;&#160; [KundeID] ASC      <br \/>)       <br \/>)<\/p>\n<\/blockquote>\n<p>Wenn wir in diese Tabelle einen Kunden eintragen und dann das Ergebnis mit @@Identity oder SCOPE_Identity() abfragen, gibt es keinen Unterschied:<\/p>\n<blockquote>\n<p>INSERT INTO Kunden SELECT &#8218;Martin&#8216;     <br \/>SELECT @@IDENTITY      <br \/>SELECT SCOPE_Identity()<\/p>\n<\/blockquote>\n<p>Beides liefert den Wert 1.<\/p>\n<p>Wenn wir aber nun eine Logging-Tabelle hinzuf\u00fcgen, die ebenfalls eine Identity-Column hat:<\/p>\n<blockquote>\n<p>CREATE TABLE [dbo].[Logging](     <br \/>&#160;&#160;&#160; [LogID] [int] IDENTITY(1,1) NOT NULL,      <br \/>&#160;&#160;&#160; [Timestamp] [datetime] NOT NULL default(getdate()),      <br \/>&#160;&#160;&#160; [Logtext] [nvarchar](max) NULL,      <br \/> CONSTRAINT [PK_Logging] PRIMARY KEY CLUSTERED       <br \/>(      <br \/>&#160;&#160;&#160; [LogID] ASC      <br \/>)      <br \/>)<\/p>\n<\/blockquote>\n<p>Und der Tabelle Kunden einen Insert-Trigger geben, der in diese Tabelle schreibt:<\/p>\n<blockquote>\n<p>CREATE TRIGGER dbo.tr_i_Kunden      <br \/>&#160;&#160; ON&#160; dbo.Kunden       <br \/>&#160;&#160; AFTER INSERT      <br \/>AS       <br \/>BEGIN      <br \/>&#160;&#160;&#160; SET NOCOUNT ON;      <br \/>&#160;&#160;&#160; <br \/>&#160;&#160;&#160; INSERT INTO Logging (LogText) VALUES (&#8218;Kunde angelegt&#8216;)      <br \/>&#160;&#160;&#160; INSERT INTO Logging (LogText) VALUES (&#8218;und dann habe ich noch \u00fcberpr\u00fcft, ob er schon da ist&#8216;)      <br \/>&#160;&#160;&#160; INSERT INTO Logging (LogText) VALUES (&#8218;und noch irgendwas anderes auch gemacht&#8216;)<\/p>\n<p>END<\/p>\n<\/blockquote>\n<p>Wenn wir jetzt einen Kunden anlegen, werden automatisch noch 3 Zeilen in die Logging-Tabelle geschrieben. <\/p>\n<p>Da <strong>@@identity<\/strong> die <strong>letzte <\/strong>Identity-Column der <strong>aktuellen Connection<\/strong> zur\u00fcckliefert, liefert dies den Identity-Wert aus der Logging-Tabelle.<\/p>\n<p>Da <strong>SCOPE_Identity()<\/strong> die <strong>letzte<\/strong> Identity-Column des <strong>aktuellen Scopes<\/strong> (also der betrachteten Tabelle) in der <strong>aktuellen Connection<\/strong> zur\u00fcckliefert, gibt das den Identity-Wert der Kunden-Tabelle.<\/p>\n<p>Wir sehen das hier:<\/p>\n<blockquote>\n<p>INSERT INTO Kunden SELECT &#8218;mein Schatz&#8216;     <br \/>SELECT @@IDENTITY      <br \/>SELECT SCOPE_Identity()<\/p>\n<\/blockquote>\n<p>liefert die Werte 3 f\u00fcr @@identity (da in Logging als letztes die Zeile 3 eingef\u00fcgt wurde) bzw. 2 f\u00fcr Scope_identity().<\/p>\n<p>Man sollte deshalb grunds\u00e4tzlich SCOPE_IDENTITY() verwenden, da dies das in der Regel gew\u00fcnschte Verhalten ist.<\/p>\n<p>Es gibt noch eine Funktion IDENT_CURRENT(\u2018Tabellenname\u2019). Diese liefert den letzten Identity-Wert f\u00fcr diese Tabelle \u2013 egal ob aus meiner Connection oder nicht. Damit sollte man also nicht versuchen, den gerade eingef\u00fcgten Identity-Wert zu ermitteln. Wenn n\u00e4mlich parallel eine andere Connection schreibt, hat man Pech gehabt.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Beides sind Funktionen, um den Wert der Identity-Column nach dem Insert zu erhalten. Als ich SQL Server gelernt hatte (1997), hatte ich nur @@identity gekannt. @@Identity hat aber einen entscheidenden Nachteil, aber dazu sp\u00e4ter mehr. Nehmen wir an, wir haben eine Kunden-Tabelle mit Identity-Column KundeID: CREATE TABLE [dbo].[Kunden]( &#160;&#160;&#160; [KundeID] [int] IDENTITY(1,1) NOT NULL, &#160;&#160;&#160; &hellip; <a href=\"https:\/\/www.csopro.de\/biblog\/2013\/10\/scope_identity-statt-identity\/\" class=\"more-link\"><span class=\"screen-reader-text\">Scope_Identity statt @@Identity<\/span> weiterlesen <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[12],"tags":[20],"class_list":["post-237","post","type-post","status-publish","format-standard","hentry","category-sqlserver","tag-identity"],"_links":{"self":[{"href":"https:\/\/www.csopro.de\/biblog\/wp-json\/wp\/v2\/posts\/237","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.csopro.de\/biblog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.csopro.de\/biblog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.csopro.de\/biblog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.csopro.de\/biblog\/wp-json\/wp\/v2\/comments?post=237"}],"version-history":[{"count":1,"href":"https:\/\/www.csopro.de\/biblog\/wp-json\/wp\/v2\/posts\/237\/revisions"}],"predecessor-version":[{"id":266,"href":"https:\/\/www.csopro.de\/biblog\/wp-json\/wp\/v2\/posts\/237\/revisions\/266"}],"wp:attachment":[{"href":"https:\/\/www.csopro.de\/biblog\/wp-json\/wp\/v2\/media?parent=237"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.csopro.de\/biblog\/wp-json\/wp\/v2\/categories?post=237"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.csopro.de\/biblog\/wp-json\/wp\/v2\/tags?post=237"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}