Dela via


rowversion (Transact-SQL)

gäller för:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceSQL-databas i Microsoft Fabric

Är en datatyp som exponerar automatiskt genererade, unika binära tal i en databas. rowversion används vanligtvis som en mekanism för versionsstämpling av tabellrader. Lagringsstorleken är 8 byte. rowversion datatyp är bara ett inkrementellt tal och bevarar inte ett datum eller en tid. Om du vill registrera ett datum eller en tid använder du en datetime2 datatyp.

Anmärkningar

Varje databas har en räknare som ökas för varje infognings- eller uppdateringsåtgärd som utförs i en tabell som innehåller en radversion kolumn i databasen. Den här räknaren är databasens rowversion. Detta spårar en relativ tid i en databas, inte en faktisk tid som kan associeras med en klocka. En tabell kan bara ha en radversion kolumn. Varje gång en rad med en radversion kolumn ändras eller infogas infogas värdet för inkrementerad databasradversion i kolumnen rowversion. Den här egenskapen gör en rowversion kolumn till en dålig kandidat för nycklar, särskilt primära nycklar. Alla uppdateringar som görs av raden ändrar värdet för rowversion och ändrar därför nyckelvärdet. Om kolumnen finns i en primärnyckel är det gamla nyckelvärdet inte längre giltigt och sekundärnycklar som refererar till det gamla värdet är inte längre giltiga. Om tabellen refereras till i en dynamisk markör ändrar alla uppdateringar positionen för raderna i markören. Om kolumnen finns i en indexnyckel genererar alla uppdateringar av dataraden även uppdateringar av indexet. Värdet rowversion ökas med alla uppdateringsinstruktiv, även om inga radvärden ändras. (Om ett kolumnvärde till exempel är 5 och en uppdateringsinstruktiv anger värdet till 5 betraktas den här åtgärden som en uppdatering trots att det inte sker någon ändring och rowversion ökas.)

tidsstämpel är synonymen för radversion datatyp och omfattas av beteendet för datatyps synonymer. I DDL-instruktioner använder du rowversion i stället för tidsstämpel där det är möjligt. Mer information finns i Data Type Synonyms (Transact-SQL).

Den Transact-SQL tidsstämpeln datatypen skiljer sig från tidsstämpel datatyp som definierats i ISO-standarden.

Not

Den tidsstämpeln syntax är inaktuell. Den här funktionen tas bort i en framtida version av SQL Server. Undvik att använda den här funktionen i nytt utvecklingsarbete och planera att ändra program som för närvarande använder den här funktionen.

I en CREATE TABLE- eller ALTER TABLE-instruktion behöver du inte ange ett kolumnnamn för tidsstämpel datatyp, till exempel:

CREATE TABLE ExampleTable (PriKey int PRIMARY KEY, timestamp);  

Om du inte anger ett kolumnnamn genererar SQL Server Database Engine tidsstämpel kolumnnamn. Men den rowversion synonymen följer inte det här beteendet. När du använder rowversionmåste du ange ett kolumnnamn, till exempel:

CREATE TABLE ExampleTable2 (PriKey int PRIMARY KEY, VerCol rowversion) ;  

Not

Duplicera radversion värden kan genereras med hjälp av SELECT INTO-instruktionen där en radversion kolumn finns i SELECT-listan. Vi rekommenderar inte att du använder rowversion på det här sättet.

En icke-radversion kolumn motsvarar semantiskt en binär(8) kolumn. En nullbar radversion kolumn motsvarar semantiskt en varbinary(8) kolumn.

Du kan använda rowversion kolumn på en rad för att enkelt avgöra om en uppdateringssats har körts mot raden sedan den senast lästes. Om en uppdateringsinstrukitet körs mot raden uppdateras värdet för rowversion. Om inga uppdateringsuttryck körs mot raden är värdet rowversion detsamma som när det lästes tidigare. Om du vill returnera det aktuella rowversionsvärdet för en databas använder du @@DBTS.

Du kan lägga till en radversion kolumn i en tabell för att upprätthålla databasens integritet när flera användare uppdaterar rader samtidigt. Du kanske också vill veta hur många rader och vilka rader som uppdaterades utan att fråga tabellen igen.

Anta till exempel att du skapar en tabell med namnet MyTest. Du fyller i vissa data i tabellen genom att köra följande Transact-SQL-instruktioner.

CREATE TABLE MyTest (myKey int PRIMARY KEY  
    ,myValue int, RV rowversion);  
GO   
INSERT INTO MyTest (myKey, myValue) VALUES (1, 0);  
GO   
INSERT INTO MyTest (myKey, myValue) VALUES (2, 0);  
GO  

Du kan sedan använda följande exempel Transact-SQL-instruktioner för att implementera optimistisk samtidighetskontroll i tabellen MyTest under uppdateringen. Skriptet använder <myRv> för att representera värdet rowversion från den senaste gången du läste raden. Ersätt värdet med det faktiska rowversion- värdet. Ett exempel på ett verkligt rowversion värde är 0x00000000000007D3.

DECLARE @t TABLE (myKey int);  
UPDATE MyTest  
SET myValue = 2  
    OUTPUT inserted.myKey INTO @t(myKey)   
WHERE myKey = 1   
    AND RV = <myRv>;  
IF (SELECT COUNT(*) FROM @t) = 0  
    BEGIN  
        RAISERROR ('error changing row with myKey = %d'  
            ,16 -- Severity.  
            ,1 -- State   
            ,1) -- myKey that was changed   
    END;  

Du kan också placera exempelinstruktionerna Transact-SQL i en transaktion. Genom att fråga @t variabeln i transaktionens omfång kan du hämta den uppdaterade myKey kolumnen i tabellen utan att fråga om tabellen MyTest.

Följande är samma exempel med hjälp av tidsstämpel syntax. Ersätt <myTS> med en faktisk tidsstämpel.

CREATE TABLE MyTest2 (myKey int PRIMARY KEY  
    ,myValue int, TS timestamp);  
GO   
INSERT INTO MyTest2 (myKey, myValue) VALUES (1, 0);  
GO   
INSERT INTO MyTest2 (myKey, myValue) VALUES (2, 0);  
GO  
DECLARE @t TABLE (myKey int);  
UPDATE MyTest2  
SET myValue = 2  
    OUTPUT inserted.myKey INTO @t(myKey)   
WHERE myKey = 1   
    AND TS = <myTS>;  
IF (SELECT COUNT(*) FROM @t) = 0  
    BEGIN  
        RAISERROR ('error changing row with myKey = %d'  
            ,16 -- Severity.  
            ,1 -- State   
            ,1) -- myKey that was changed   
    END;  

Se även

ALTER TABLE (Transact-SQL)
CAST och CONVERT (Transact-SQL)
CREATE TABLE (Transact-SQL)
datatyper (Transact-SQL)
DECLARE @local_variable (Transact-SQL)
DELETE (Transact-SQL)
INSERT (Transact-SQL)
MIN_ACTIVE_ROWVERSION (Transact-SQL)
SET @local_variable (Transact-SQL)
UPDATE (Transact-SQL)