den här artikeln utforskar Identitetsfunktionen i SQL Server med exempel och skillnader mellan dessa funktioner.
översikt över identitetskolumner
i SQL Server skapar vi en identitetskolumn för att automatiskt generera inkrementella värden. Det genererar värden baserade på fördefinierat frö (initialvärde) och stegvärde (inkrement). Anta till exempel att vi har ett personalbord och vi vill generera EmployeeID automatiskt., Vi har en start anställd ID 100 och ytterligare vill öka varje ny EmpID av en. I det här fallet måste vi definiera följande värden.
- frö: 100
- Steg: 1
låt oss infoga några poster i den här tabellen och visa posterna.
Du kan se att den första medarbetaren får ett ID-värde 100 och varje nytt posters id-värde får en ökning av en.
Vi har några användbara identitetsfunktioner i SQL Server för att arbeta med identitetskolumnerna i en tabell. Låt oss utforska följande identitetsfunktioner med exempel.,
- SQL @@IDENTITY Function
- SQL SCOPE_IDENTITY() Function
- SQL IDENT_CURRENT Function
- SQL IDENTITY Function
SQL @@IDENTITY Function
vi använder system function @@IDENTITY för att returnera det maximala använda IDENTITETSVÄRDET i en tabell för IDENTITETSKOLUMNEN under den aktuella sessionen. När vi sätter in en rad i en tabell, kolumnen @@IDENTITY funktion ger IDENTITETSVÄRDET genereras av uttalandet. Om vi kör någon fråga som inte genererar IDENTITETSVÄRDEN får vi NULL-värde i utmatningen., SQL @ @ IDENTITY körs inom ramen för den aktuella sessionen. Vi kan inte använda den på en fjärr-eller länkad server.
låt oss förstå det med följande exempel.
- Steg 1: Vi har ett aktuellt maximalt identitetsvärde 110 i EmployeeData-tabellen
- steg 2: i den aktuella sessionen sätter vi in en post i EmployeeData-tabellen., Det ökar identitetsvärdet med en
- steg 3: Vi kan verifiera att det maximala använda identitetsvärdet är 111
- Step4: vi använder funktionen SELECT @@IDENTITY i den aktuella sessionen för att få identitetsvärdet genererat i den här sessionen
låt oss infoga flera poster i den här tabellen och köra SELECT @IDENTITY.
om vi infogar flera poster i en session returnerar SELECT @@Identity det maximala IDENTITETSVÄRDET som genereras i den här sessionen., I följande exempel lägger vi in tre poster, och det ökar IDENTITETSVÄRDENA med tre från det aktuella identitetsvärdet 111.
om uttalandet inte genererar några identitetsvärden returnerar det NULL-värden i utdata.
SQL SCOPE_IDENTITY() funktion
vi använder SCOPE_IDENTITY () – funktionen för att returnera det senaste IDENTITETSVÄRDET i en tabell under nuvarande omfattning. En omfattning kan vara en modul, trigger, funktion eller en lagrad procedur., Vi kan överväga SQL SCOPE_IDENTITY () – funktionen som liknar @@IDENTITY-funktionen, men den är begränsad till ett visst tillämpningsområde. Den returnerar NULL-värdet om den här funktionen är inblandad innan en insert-sats genererar värde under samma omfattning.
i följande exempel ser vi att både @@IDENTITY och SCOPE_IDENTITY() returnerar samma värde i den aktuella sessionen och liknande omfattning.
låt oss förstå skillnaden mellan SCOPE_IDENTITY() och @@IDENTITY med ett annat exempel.,
låt oss överväga att vi har två tabeller EmployeeData och avdelningar tabell. Vi skapar en INSERT trigger på Employeedatatabellen. När vi sätter in någon rad på EmployeeData, det kallar till definierad trigger för att infoga en rad i avdelningar.
i följande fråga skapar vi en utlösare för att infoga standardvärdet ” IT ” i tabellen avdelningar för varje insats i tabellen EmployeeData.,f7″>
1
2
3
4
5
6
|
skapa Trigger t_insert_department
på employeedata
för Infoga som
börja
infoga avdelningar värden (’it’)
avsluta;
|
låt oss infoga värdet i personaldatatabellen och visa utdata från både @@identity och scope_identity() funktioner.,
i den aktuella sessionen infogade vi data i EmployeeData-tabellen. Det genererar en identitet i denna tabell. Värdet för identitetsfrö är 1 för tabellen EmployeeData.
När vi sätter in värde i EmployeeData-tabellen utlöser det en utlösare för att infoga värde i Avdelningstabellen. Värdet för identitetsfrö är 100 för Avdelningstabellen.
- vi får utdata 100 för SELECT @@IDENTITY-funktionen
- SCOPE_IDENTITY-funktionen returnerar identitetsvärdet endast under det aktuella området., Det ger utgång 1 för denna funktion
SQL IDENT_CURRENT() funktion
vi använder IDENT_CURRENT-funktionen för att returnera det senaste IDENTITETSVÄRDET som genereras för en angiven tabell under vilken anslutning som helst. Det tar inte hänsyn till omfattningen av SQL-frågan som genererar identitetsvärde. Vi måste ange tabellen för vilken vi vill kontrollera identitetsvärdet.
i följande skärmdump kan vi se att vi infogar data i Session id 64 och det genererar identitetsvärde 2 i EmployeeData-tabellen.,
Vi kan kolla in ett annat anslutningsfönster om det aktuella identitetsvärdet för EmployeeData-tabellen och få samma utdata som identitetsvärde 2.,
1
|
SELECT IDENT_CURRENT(’EmployeeData’) AS IdentityValue
|
SQL IDENTITY Function
In my previous article, we explored SQL SELECT INTO Statement, to create a new table and inserted data into it from the existing table., Vi kan använda SQL IDENTITY-funktionen för att infoga identitetsvärden i tabellen som skapats av SQL SELECT i satsen.
som standard, om en källtabell innehåller en identitetskolumn, ärver tabellen som skapas med en SELECT INTO-Sats den. Tänk på ett scenario där du vill skapa en tabell med hjälp av select INTO-uttrycket från utmatningen från en vy eller gå med från flera tabeller. I det här fallet vill du också skapa en identitetskolumn i en ny tabell.,
- Obs! SQL IDENTITY-funktionen skiljer sig från IDENTITY-egenskapen som vi använder när du skapar en tabell.
Vi måste ange en datatyp för en kolumn för att använda SQL Identity-funktionen. Vi måste också ange frö-och Stegvärden för att definiera en identitetskonfiguration.
Vi kan inte använda SQL IDENTITY-funktionen i en Select-sats. Vi får följande felmeddelande.
Msg 177, Level 15, State 1, Line 2 IDENTITY-funktionen kan endast användas när SELECT-satsen har en INTO-klausul.,
låt oss skapa en tabell med SQL SELECT INTO-satsen med följande fråga.
när uttalandet körs, kontrollera tabellegenskaperna med kommandot sp_help.
1
|
sp_help ’temptable’
|
Du kan se identitetskolumnen i temptable-egenskaperna enligt de angivna villkoren.,
låt oss titta på ett annat exempel. Utför följande kommando.,
1
2
3
4
5
|
välj identitet( int, 100, 2) som new_id,
id,
namn
i temp2
från employeedata;
|
Vi har redan identitetskolumnen i employeedata-tabellen. Den nya tabellen temp2 ärver också kolumnen identitet., Vi kan inte ha flera IDENTITETSKOLUMNER i en tabell. På grund av detta får vi följande felmeddelande.
Msg 8108, Level 16, State 1, Line 1Cannot add identity column, med hjälp av SELECT INTO-satsen, till tabellen ”temp2″, som redan har kolumnen ” ID ” som ärver identitetsfastigheten.
sammanfattning
- SQL-identitetsfunktioner SCOPE_IDENTITY, IDENT_CURRENT och @@IDENTITY returnerar liknande utdata för en IDENTITETSKOLUMN i den aktuella sessionen
- SCOPE_IDENTITY returnerar värden under den aktuella räckvidden., Vi kan definiera omfattning som en modul, lagrad procedur, utlösare eller en funktion
- IDENT_CURRENT-funktionen returnerar identitetsvärde för en angiven tabell angående en anslutning som ändrade värdet
- vi kan använda SQL IDENTITY-funktionen för att definiera identitet i en tabell som skapats med hjälp av SQL SELECT INTO-sats
slutsats
hade i den här artikeln utforskade vi Identitetsfunktionerna i SQL Server. Vi borde vara bekanta med funktionerna för att använda dem i att skriva T-SQL-frågor. Om du har kommentarer eller frågor, gärna lämna dem i kommentarerna nedan.,
- författare
- Senaste inlägg
han är skaparen av en av de största gratis online samlingar av artiklar om ett enda ämne, med sin 50-del serien på SQL Server alltid på tillgänglighet grupper. Baserat på hans bidrag till SQL Server-samhället har han blivit erkänd med olika utmärkelser, inklusive den prestigefyllda ”årets bästa författare” kontinuerligt i 2020 och 2021 på SQLShack.,
Raj är alltid intresserad av nya utmaningar så om du behöver konsulthjälp i något ämne som omfattas av hans skrifter, kan han nås på rajendra.gupta16@gmail.,com
Visa alla inlägg från Rajendra Gupta
- utföra mindre och större versionsuppgraderingar för AWS RDS SQL Server – Januari 29, 2021
- distribuera AWS RDS PostgreSQL instances – Januari 27, 2021
- migrera dina lokala SQL-databaser till AWS rds SQL Server med AWS DMS – 25 januari 2021