SKIFTBORD (Transact-SQL)

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

Returnerar information om förändringsspårning för en tabell. Du kan använda denna sats för att returnera alla ändringar för en tabell eller för att spåra ändringar för en specifik rad.

Transact-SQL syntaxkonventioner

Syntax

CHANGETABLE (  
    { CHANGES <table_name> , <last_sync_version> 
    | VERSION <table_name> , <primary_key_values> } 
    , [ FORCESEEK ] 
    )  
[AS] <table_alias> [ ( <column_alias> [ ,...n ] )  
  
<primary_key_values> ::=  
( <column_name> [ , ...n ] ) , ( <value> [ , ...n ] )  

Arguments

FÖRÄNDRINGAR table_name , last_sync_version
Returnerar spårningsinformation för alla ändringar i en tabell som har skett sedan versionen som anges av last_sync_version.

table_name
Är den användardefinierade tabellen där man ska hämta spårade ändringar. Ändringsspårning måste vara aktiverad på bordet. Ett tabellnamn med en, två, tre eller fyra delar kan användas. Tabellnamnet kan vara en synonym till tabellen.

last_sync_version
Ett nullbart bigint-skalärvärde . Ett uttryck orsakar ett syntaxfel. Om värdet är NULL returneras alla spårade ändringar. När den hämtar ändringar måste den anropande applikationen specificera den punkt från vilken ändringar krävs. Den last_sync_version specificerar den punkten. Funktionen returnerar information för alla rader som har ändrats sedan den versionen. Applikationen begär att få ändringar med en version större än last_sync_version. Vanligtvis, innan ändringarna hämtas, anropar CHANGE_TRACKING_CURRENT_VERSION() applikationen för att hämta den version som ska användas nästa gång ändringar krävs. Därför behöver applikationen inte tolka eller förstå det faktiska värdet. Eftersom last_sync_version erhålls av den anropande applikationen måste applikationen behålla värdet. Om applikationen förlorar detta värde måste den reinitialisera data. last_sync_version bör valideras för att säkerställa att den inte är för gammal, eftersom en del eller all ändringsinformation kan ha rensats enligt den lagringsperiod som är konfigurerad för databasen. För mer information, se CHANGE_TRACKING_MIN_VALID_VERSION (Transact-SQL) och ALTER DATABASE SET Options (Transact-SQL).

VERSION table_name, { primary_key_values }
Returnerar den senaste ändringsspårningsinformationen för en angiven rad. Primärnyckelvärden måste identifiera raden. primary_key_values identifierar primärnyckelkolumnerna och specificerar värdena. Primärnyckelkolumnernas namn kan anges i valfri ordning.

table_name
Är den användardefinierade tabellen där man kan hämta information om förändringsspårning. Ändringsspårning måste vara aktiverad på bordet. Ett tabellnamn med en, två, tre eller fyra delar kan användas. Tabellnamnet kan vara en synonym till tabellen.

column_name
Specificerar namnet på primärnyckelkolumnen eller kolumnerna. Flera kolumnnamn kan anges i valfri ordning.

value
Är värdet av primärnyckeln. Om det finns flera primärnyckelkolumner måste värdena anges i samma ordning som kolumnerna visas i column_name listan.

[ FORCESEEK ]
Gäller för: SQL Server (med start från SQL Server 2016 (13.x) SP2 CU16, SQL Server 2017 (14.x) CU24 och SQL Server 2019 (15.x) CU11), Azure SQL Database och Azure SQL Managed Instance

Valfri parameter som tvingar fram en sökoperation för att komma åt table_name. I vissa fall där mycket få rader har ändrats kan en skanningsoperation fortfarande användas för att komma åt table_name. Om en skanningsoperation orsakar ett prestandaproblem, använd parametern FORCESEEK .

[AS] table_alias [ (column_alias [ ,... n ] ) ]
Tillhandahåller namn för resultaten som returneras av CHANGETABLE.

table_alias
Är aliasnamnet på tabellen som returneras av CHANGETABLE. table_alias krävs och måste vara en giltig identifierare.

column_alias
Är ett valfritt kolumnalias eller lista med kolumnaliaser för de kolumner som returneras av CHANGETABLE. Detta möjliggör anpassning av kolumnnamn om det finns dubbletter i resultaten.

Returtyper

table

Returnera värden

FÖRÄNDRINGAR AV SKIFTBARA

När CHANGES anges returneras noll eller fler rader med följande kolumner.

Kolumnnamn Datatyp Description
SYS_CHANGE_VERSION bigint Versionsvärde som är kopplat till den senaste ändringen i raden
SYS_CHANGE_CREATION_VERSION bigint Versionsvärden som är kopplade till den senaste insättningsoperationen.
SYS_CHANGE_OPERATION nchar(1) Specificerar typen av förändring:

U = Uppdatering

I = Infoga

D = Ta bort
SYS_CHANGE_COLUMNS varbinär(4100) Listar kolumnerna som har ändrats sedan last_sync_version (baslinjen). Observera att beräknade kolumner aldrig listas som ändrade.

Värdet är NULL när något av följande villkor är sant:

Spårning av kolumnändringar är inte aktiverad.

Operationen är en insättnings- eller borttagningsoperation.

Alla icke-primärnyckelkolumner uppdaterades i en och samma operation. Detta binära värde ska inte tolkas direkt. Använd istället CHANGE_TRACKING_IS_COLUMN_IN_MASK(), för att tolka det.
SYS_CHANGE_CONTEXT varbinary(128) Ändra kontextinformation som du valfritt kan specificera genom att använda WITH-klausulen som en del av ett INSERT-, UPDATE- eller DELETE-sats.
<Primärnyckelkolumnens värde> Samma som kolumnerna i användartabellerna De primära nyckelvärdena för den spårade tabellen. Dessa värden identifierar entydigt varje rad i användartabellen.

CHANGETABLE-VERSION

När VERSION anges returneras en rad med följande kolumner.

Kolumnnamn Datatyp Description
SYS_CHANGE_VERSION bigint Nuvarande versionsändring som är kopplad till raden.

Värdet är NULL om en ändring inte har gjorts under en längre period än lagringsperioden för förändringsspårning, eller om raden inte har ändrats sedan ändringsspårningen aktiverades.
SYS_CHANGE_CONTEXT varbinary(128) Ändra kontextinformation som du valfritt kan specificera genom att använda WITH-klausulen som en del av ett INSERT-, UPDATE- eller DELETE-sats.
<Primärnyckelkolumnens värde> Samma som kolumnerna i användartabellerna De primära nyckelvärdena för den spårade tabellen. Dessa värden identifierar entydigt varje rad i användartabellen.

Anmärkningar

Funktionen CHANGETABLE används vanligtvis i FROM-klausulen i en fråga som om det vore en tabell.

CHANGETABLE(CHANGES...)

För att få raddata för nya eller modifierade rader, koppla resultatuppsättningen till användartabellen genom att använda primärnyckelkolumnerna. Endast en rad returneras för varje rad i användartabellen som har ändrats, även om det har skett flera ändringar i samma rad sedan värdet last_sync_version .

Primärnyckelkolumnändringar markeras aldrig som uppdateringar. Om ett primärnyckelvärde ändras betraktas det som en borttagning av det gamla värdet och en insättning av det nya värdet.

Om du tar bort en rad och sedan lägger till en rad som har den gamla primärnyckeln, ses ändringen som en uppdatering av alla kolumner i raden.

De värden som returneras för SYS_CHANGE_OPERATION och SYS_CHANGE_COLUMNS kolumnerna är relativa till baslinjen (last_sync_version) som specificeras. Till exempel, om en insättningsoperation gjordes vid version 10 och en uppdateringsoperation vid version 15, och om baslinje-last_sync_version är 12, kommer en uppdatering att rapporteras. Om last_sync_version värdet är 8, kommer en insats att rapporteras. SYS_CHANGE_COLUMNS kommer aldrig att rapportera beräknade kolumner som uppdaterade.

Generellt spåras alla operationer som infogar, uppdaterar eller tar bort data i användartabeller, inklusive MERGE-satsen.

Följande operationer som påverkar användardata i tabellerna spåras inte:

  • Utför uttalandet UPDATETEXT . Detta uttalande är föråldrat och kommer att tas bort i en framtida version av SQL Server. Dock spåras ändringar som görs genom att använda klausulen .WRITE i UPDATE-satsen.

  • Rader rader med hjälp av TRUNCATE TABLE. När en tabell trunkeras återställs versionsinformationen för förändringsspårning som är kopplad till tabellen, som om ändringsspårningen just hade aktiverats i tabellen. En klientapplikation bör alltid validera sin senaste synkroniserade version. Valideringen misslyckas om tabellen har trunkerats.

CHANGETABLE(VERSION...)

En tom resultatmängd returneras om en icke-existerande primärnyckel specificeras.

Värdet av SYS_CHANGE_VERSION kan vara NULL om en ändring inte har gjorts längre än lagringsperioden (till exempel om rensningen har tagit bort ändringsinformationen) eller om raden aldrig har ändrats sedan ändringsspårningen aktiverades för tabellen.

Permissions

Kräver SELECT behörighet på primärnyckelkolumnerna och VIEW CHANGE TRACKING behörighet på tabellen som specificeras av <värdet table_name> för att få information om förändringsspårning.

Examples

A. Returnera rader för en initial synkronisering av data

Följande exempel visar hur man erhåller data för en initial synkronisering av tabelldatan. Frågan returnerar all raddata och deras tillhörande versioner. Du kan sedan infoga eller lägga till denna data i systemet som kommer att innehålla den synkroniserade datan.

-- Get all current rows with associated version  
SELECT e.[Emp ID], e.SSN, e.FirstName, e.LastName,  
    c.SYS_CHANGE_VERSION, c.SYS_CHANGE_CONTEXT  
FROM Employees AS e  
CROSS APPLY CHANGETABLE   
    (VERSION Employees, ([Emp ID], SSN), (e.[Emp ID], e.SSN)) AS c;  

B. Listar alla ändringar som gjorts sedan en specifik version

Följande exempel listar alla ändringar som gjorts i en tabell sedan den angivna versionen (@last_sync_version). [Emp ID] och SSN är kolumner i en sammansatt primärnyckel.

DECLARE @last_sync_version bigint;  
SET @last_sync_version = <value obtained from query>;  
SELECT [Emp ID], SSN,  
    SYS_CHANGE_VERSION, SYS_CHANGE_OPERATION,  
    SYS_CHANGE_COLUMNS, SYS_CHANGE_CONTEXT   
FROM CHANGETABLE (CHANGES Employees, @last_sync_version) AS C;  

C. Hämta all ändrad data för en synkronisering

Följande exempel visar hur du kan få all data som har ändrats. Denna fråga kopplar ihop ändringsspårningsinformationen med användartabellen så att användartabellsinformation returneras. A används så att en rad returneras för raderade LEFT OUTER JOIN rader.

-- Get all changes (inserts, updates, deletes)  
DECLARE @last_sync_version bigint;  
SET @last_sync_version = <value obtained from query>;  
SELECT e.FirstName, e.LastName, c.[Emp ID], c.SSN,  
    c.SYS_CHANGE_VERSION, c.SYS_CHANGE_OPERATION,  
    c.SYS_CHANGE_COLUMNS, c.SYS_CHANGE_CONTEXT   
FROM CHANGETABLE (CHANGES Employees, @last_sync_version) AS c  
    LEFT OUTER JOIN Employees AS e  
        ON e.[Emp ID] = c.[Emp ID] AND e.SSN = c.SSN;  

D. Upptäckt av konflikter genom att använda CHANGETABLE(VERSION...)

Följande exempel visar hur man uppdaterar en rad endast om raden inte har ändrats sedan senaste synkroniseringen. Versionsnumret för den specifika raden erhålls genom att använda CHANGETABLE. Om raden har uppdaterats görs inga ändringar och frågan returnerar information om den senaste ändringen i raden.

-- @last_sync_version must be set to a valid value  
UPDATE  
    SalesLT.Product  
SET  
    ListPrice = @new_listprice  
FROM  
    SalesLT.Product AS P  
WHERE  
    ProductID = @product_id AND  
    @last_sync_version >= ISNULL (  
        (SELECT CT.SYS_CHANGE_VERSION FROM   
            CHANGETABLE(VERSION SalesLT.Product,  
            (ProductID), (P.ProductID)) AS CT),  
        0);  

Se även

Ändringsspårningsfunktioner (Transact-SQL)
Spåra dataändringar (SQL Server)
CHANGE_TRACKING_IS_COLUMN_IN_MASK (Transact-SQL)
CHANGE_TRACKING_CURRENT_VERSION (Transact-SQL)
CHANGE_TRACKING_MIN_VALID_VERSION (Transact-SQL)