Denna artikel är en spegelartikel om maskinöversättning, klicka här för att hoppa till originalartikeln.

Utsikt: 11405|Svar: 0

[Tips] sql får primärnyckelvärdet efter att ha väntat på INSERT

[Kopiera länk]
Publicerad på 2015-05-05 17:35:51 | | |

Funktion för att hämta identifieringsvärde i SQL SERVER 2000     
  I SQL Server 2000 definieras identitetskolumnen av IDENTITY, och följande är relaterat till att få identitetsvärdet för den senast insatta posten   
   
  Ett exempel på funktionen av av     
   
          I SQL Server kan du använda SCOPE_IDENTITY(), @@IDENTITY, IDENT_CURRENT() för att få värdet på den senast insatta posten, och skillnaden mellan dem är:   
  SCOPE_IDENTITY() returnerar det senaste IDENTITY-värdet som infogades i kolumnen IDENTITY i samma scope. Ett scope är en modul – lagrade procedurer, triggers, funktioner   
   
  Antal eller batcher. Därför, om två satser är i samma lagrade procedur, funktion eller batch, är de i samma scope.   
  @@IDENTITY Returnerar det senaste identifieringsvärdet som genererats i alla tabeller i den aktuella sessionen   
  IDENT_CURRENT() returnerar det senaste identifieringsvärdet som genererats för den angivna tabellen i varje session och varje omfattning   
  Här är ett exempel för att illustrera deras skillnader     
   
  -- a) Exempelkod     
  --   ===========================================   
  -- Skapa en testtabell   
  --   ===========================================   
  ANVÄND tempdb   
  KÖR   
   
  SKAPA TABELL t1(id int IDENTITY,col int)   
  INFOGA t1 VÄLJ 1   
  UNION ALLA VÄLJ 2   
  CREATE TABLE t2(id int IDENTITY,col int)   
  KÖR   
   
  SKAPA TRIGGER TR_insert_t2 PÅ T2   
  FÖR INSATS   
  AS   
          INFOGA t1 VÄLJ 3   
  KÖR     
   
  --   ===========================================   
  -- Testa tre funktioner: 1   
  --   ===========================================   
  INFOGA t2-VÄRDEN(1)   
  VÄLJ [SCOPE_IDENTITY()]=SCOPE_IDENTITY(),   
          [@@IDENTITY]=@@IDENTITY,   
          [IDENT_CURRENT() För t1]=IDENT_CURRENT(N't1'),   
          [IDENT_CURRENT() För t2]=IDENT_CURRENT(N't2')   
   
  /*--Resultat   
  SCOPE_IDENTITY() @@IDENTITY IDENT_CURRENT() För t1 IDENT_CURRENT() För t2                                         
  ------------------   ------------   --------------------------   -----------------------   
  1                                     3                         3                                                     1   
   
  (Antalet rader som påverkas är 1 rad)   
  --*/   
  KÖR   
   
  --   ===========================================   
  -- Testa tre funktioner: 2   
  --   ===========================================   
  INFOGA T1-VÄRDEN(10)   
  VÄLJ [SCOPE_IDENTITY()]=SCOPE_IDENTITY(),   
          [@@IDENTITY]=@@IDENTITY,   
          [IDENT_CURRENT() För t1]=IDENT_CURRENT(N't1'),   
          [IDENT_CURRENT() För t2]=IDENT_CURRENT(N't2')   
   
  /*--Resultat   
  SCOPE_IDENTITY() @@IDENTITY IDENT_CURRENT() För t1 IDENT_CURRENT() För t2                                         
  ------------------   ------------   --------------------------   -----------------------   
  4                                     4                         4                                                     1   
   
  (Antalet rader som påverkas är 1 rad)   
  --*/   
  KÖR   
   
  --   ===========================================   
  -- Testa tre funktioner: 3   
  -- ** Öppna en ny anslutning och kör följande kod **   
  --   ===========================================   
  VÄLJ [SCOPE_IDENTITY()]=SCOPE_IDENTITY(),   
          [@@IDENTITY]=@@IDENTITY,   
          [IDENT_CURRENT() För t1]=IDENT_CURRENT(N't1'),   
          [IDENT_CURRENT() För t2]=IDENT_CURRENT(N't2')   
   
  /*--Resultat   
  SCOPE_IDENTITY() @@IDENTITY IDENT_CURRENT() För t1 IDENT_CURRENT() För t2                                         
  ------------------   ------------   --------------------------   -----------------------   
  NULL NULL 4 &n     
   
  --===========================================   
  -- Ta bort testmiljön   
  --   ===========================================   
  SLÄPP TABELL t1,t2     
   
  -- b) Kodresultatbeskrivning     
  Som du kan se från koden ovan:   
  IDENT_CURRENT() returnerar alltid det senast identifierade värdet som infogades i den angivna tabellen   
  @@IDENTITY Returnerar identitetsvärdet för den aktuella sessionen, oavsett om den är i samma omfattning eller inte, i test 1 och 2, kan man se att den returnerar identitetsvärdet för den infogade posten i triggern, och i   
   
  I Test 3 returneras NULL eftersom det inte finns någon insättningspost i den aktuella sessionen   
  SCOPE_IDENTITY() returnerar identifieringsvärdet för samma omfattning som den aktuella sessionen, så i test 1, 2 returnerar den värdet som inte påverkas av triggern, och i test 3, eftersom den aktuella sessionen inte interpoleras   
   
  post, så den returnerar NULL





Föregående:Varför åkte alla till första maj-helgen?
Nästa:Vad är skillnaden mellan att SCOPE_IDENTITY() skrivs före och efter i t-sql?
Friskrivning:
All programvara, programmeringsmaterial eller artiklar som publiceras av Code Farmer Network är endast för lärande- och forskningsändamål; Ovanstående innehåll får inte användas för kommersiella eller olagliga ändamål, annars kommer användarna att bära alla konsekvenser. Informationen på denna sida kommer från internet, och upphovsrättstvister har inget med denna sida att göra. Du måste helt radera ovanstående innehåll från din dator inom 24 timmar efter nedladdning. Om du gillar programmet, vänligen stöd äkta programvara, köp registrering och få bättre äkta tjänster. Om det finns något intrång, vänligen kontakta oss via e-post.

Mail To:help@itsvse.com