CHANGETABLE (Transact-SQL)

Gilt für:SQL ServerAzure SQL-DatenbankAzure SQL Managed Instance

Gibt Überarbeitungsinformationen für eine Tabelle zurück. Sie können diese Anweisung verwenden, um alle Änderungen für eine Tabelle oder die Überarbeitungsinformationen für eine bestimmte Zeile abzurufen.

Transact-SQL-Syntaxkonventionen

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 ] )  

Argumente

ÄNDERUNGEN table_name , last_sync_version
Gibt Nachverfolgungsinformationen für alle Änderungen an einer Tabelle zurück, die seit der von last_sync_version angegebenen Version aufgetreten sind.

table_name
Die benutzerdefinierte Tabelle, von der nachverfolgte Änderungen abgerufen werden sollen. Die Änderungsnachverfolgung muss für die Tabelle aktiviert sein. Es kann ein Tabellenname verwendet werden, der aus ein, zwei, drei oder vier Teilen besteht. Der Tabellenname kann synonym mit der Tabelle sein.

last_sync_version
Ein nullabler bigint skalarer Wert. Ein Ausdruck verursacht einen Syntaxfehler. Wenn der Wert NULL ist, werden alle nachverfolgten Änderungen zurückgegeben. Wenn Änderungen abgeufen werden, muss die aufrufende Anwendung den Punkt angeben, ab dem Änderungen erforderlich sind. Der last_sync_version gibt diesen Punkt an. Die Funktion gibt Informationen für alle Zeilen zurück, die ab dieser Version geändert worden sind. Die Anwendung fragt ab, um Änderungen mit einer Version zu erhalten, die größer als last_sync_version ist. In der Regel ruft CHANGE_TRACKING_CURRENT_VERSION() die Anwendung auf, bevor änderungen abgerufen werden, um die Version abzurufen, die bei der nächsten Anforderung von Änderungen verwendet wird. Deshalb muss die Anwendung den tatsächlichen Wert nicht interpretieren oder verstehen. Da last_sync_version von der aufrufenden Anwendung abgerufen wird, muss die Anwendung den Wert beibehalten. Wenn die Anwendung diesen Wert verliert, müssen Daten erneut initialisiert werden. last_sync_version sollten überprüft werden, um sicherzustellen, dass sie nicht zu alt ist, da einige oder alle Änderungsinformationen möglicherweise gemäß dem für die Datenbank konfigurierten Aufbewahrungszeitraum bereinigt wurden. Weitere Informationen finden Sie unter CHANGE_TRACKING_MIN_VALID_VERSION (Transact-SQL) und ALTER DATABASE SET-Optionen (Transact-SQL).

VERSION table_name, { primary_key_values }
Gibt die letzten Änderungsnachverfolgungsinformationen für eine angegebene Zeile zurück. Primärschlüsselwerte müssen die Zeile identifizieren. primary_key_values identifiziert die Primärschlüsselspalten und gibt die Werte an. Die Namen der Primärschlüsselspalten können in beliebiger Reihenfolge angegeben werden.

table_name
Die benutzerdefinierte Tabelle, von der Änderungsnachverfolgungsinformationen abgerufen werden sollen. Die Änderungsnachverfolgung muss für die Tabelle aktiviert sein. Es kann ein Tabellenname verwendet werden, der aus ein, zwei, drei oder vier Teilen besteht. Der Tabellenname kann synonym mit der Tabelle sein.

column_name
Gibt den Namen der Primärschlüsselspalte oder der Spalten an. Es können mehrere Spaltennamen in beliebiger Reihenfolge angegeben werden.

value
Der Wert des Primärschlüssels. Wenn mehrere Primärschlüsselspalten vorhanden sind, müssen die Werte in der gleichen Reihenfolge angegeben werden, in der die Spalten in der liste column_name angezeigt werden.

[ FORCESEEK ]
Gilt für: SQL Server (ab SQL Server 2016 (13.x) SP2 CU16, SQL Server 2017 (14.x) CU24 und SQL Server 2019 (15.x) CU11), Azure SQL Database und Azure SQL Managed Instance

Optionaler Parameter, der erzwingt, dass ein Suchvorgang für den Zugriff auf die table_name verwendet wird. In einigen Fällen, in denen sich nur sehr wenige Zeilen geändert haben, kann weiterhin ein Scanvorgang verwendet werden, um auf die table_name zuzugreifen. Wenn durch einen Scanvorgang ein Leistungsproblem auftritt, verwenden Sie den FORCESEEK Parameter.

[AS] table_alias [ (column_alias [ ,... n ] ) ] ]
Stellt Namen für die Ergebnisse bereit, die von CHANGETABLE zurückgegeben werden.

table_alias
Der Aliasname der Tabelle, der von CHANGETABLE zurückgegeben wird. table_alias ist erforderlich und muss ein gültiger Bezeichner sein.

column_alias
Ein optionaler Spaltenalias oder eine Liste von Spaltenaliasnamen für die Spalten, die von CHANGETABLE zurückgegeben werden. Hierdurch können Spaltennamen angepasst werden, falls die Ergebnisse doppelte Namen aufweisen.

Rückgabetypen

Tabelle

Rückgabewerte

CHANGETABLE CHANGES

Wenn CHANGES angegeben wird, werden 0 oder mehr Zeilen, die die folgenden Spalten aufweisen, zurückgegeben.

Spaltenname Datentyp BESCHREIBUNG
SYS_CHANGE_VERSION bigint Versionswert, der der letzten Änderung an der Zeile zugeordnet ist.
SYS_CHANGE_CREATION_VERSION bigint Versionswerte, die dem letzten Einfügevorgang zugeordnet sind.
SYS_CHANGE_OPERATION nchar(1) Gibt den Typ der Änderung an:

U = Update

I = Einfügen

D = Löschen
SYS_CHANGE_COLUMNS varbinary(4100) Listet die Spalten auf, die sich seit last_sync_version (der Baseline) geändert haben. Beachten Sie, dass berechnete Spalten nie als geändert aufgeführt werden.

Der Wert ist NULL, wenn eine der folgenden Bedingungen zutrifft:

Die Änderungsnachverfolgung für Spalten ist nicht aktiviert.

Der Vorgang ist ein Einfüge- oder Löschvorgang.

Alle Nicht-Primärschlüsselspalten wurden in einem Vorgang aktualisiert. Dieser Binärwert sollte nicht direkt interpretiert werden. Verwenden Sie zum Interpretieren stattdessen CHANGE_TRACKING_IS_COLUMN_IN_MASK().
SYS_CHANGE_CONTEXT varbinary(128) Ändern Sie Kontextinformationen, die Sie optional angeben können, indem Sie die WITH-Klausel als Teil einer INSERT-, UPDATE- oder DELETE-Anweisung verwenden.
<> Identisch mit den Benutzertabellenspalten. Die Primärschlüsselwerte für die nachverfolgte Tabelle. Diese Werte identifizieren jede Zeile in der Benutzertabelle eindeutig.

CHANGETABLE VERSION

Wenn VERSION angegeben wird, wird eine Zeile, die die folgenden Spalten aufweist, zurückgegeben.

Spaltenname Datentyp BESCHREIBUNG
SYS_CHANGE_VERSION bigint Wert der aktuellen Änderungsversion, der mit der Zeile verknüpft ist.

Der Wert ist NULL, wenn für einen längeren Zeitraum als der Beibehaltungsdauer für die Änderungsnachverfolgung keine Änderung vorgenommen wurde oder wenn die Zeile seit Aktivierung der Änderungsnachverfolgung nicht geändert wurde.
SYS_CHANGE_CONTEXT varbinary(128) Änderungskontextinformationen, die optional angegeben werden können, indem Sie die WITH-Klausel als Teil einer INSERT-, UPDATE- oder DELETE-Anweisung verwenden.
<> Identisch mit den Benutzertabellenspalten. Die Primärschlüsselwerte für die nachverfolgte Tabelle. Diese Werte identifizieren jede Zeile in der Benutzertabelle eindeutig.

Bemerkungen

Die CHANGETABLE-Funktion wird in der Regel in der FROM-Klausel einer Abfrage verwendet, so als handele es sich um eine Tabelle.

CHANGETABLE(CHANGES...)

Um Zeilendaten für neue oder geänderte Zeilen zu erhalten, verbinden Sie das Resultset mit der Benutzertabelle, indem Sie die Primärschlüsselspalten verwenden. Es wird nur eine Zeile für jede Zeile in der Benutzertabelle zurückgegeben, die geändert wurde, auch wenn seit dem last_sync_version Wert mehrere Änderungen an derselben Zeile vorgenommen wurden.

Änderungen von Primärschlüsselspalten werden nie als Updates markiert. Wenn sich ein Primärschlüsselwert ändert, wird dies als Löschung des alten Werts und Einfügung des neuen Werts betrachtet.

Wenn Sie eine Zeile löschen und dann eine Zeile mit dem alten Primärschlüssel einfügen, wir die Änderung als Aktualisierung aller Spalten in der Zeile betrachtet.

Die werte, die für die SYS_CHANGE_OPERATION Spalten und SYS_CHANGE_COLUMNS zurückgegeben werden, sind relativ zur angegebenen Baseline (last_sync_version). Wenn z. B. ein Einfügevorgang unter version 10 und ein Aktualisierungsvorgang unter Version 15durchgeführt wurde, und wenn die Baseline-last_sync_version ist 12, wird ein Update gemeldet. Wenn der last_sync_version Wert ist 8, wird eine Einfügung gemeldet. SYS_CHANGE_COLUMNS meldet berechnete Spalten nie als aktualisiert.

Im Allgemeinen werden alle Vorgänge, bei denen Daten in Benutzertabellen eingefügt, aktualisiert oder gelöscht werden, nachverfolgt, einschließlich der MERGE-Anweisung.

Die folgenden Vorgänge, die sich auf Benutzertabellendaten auswirken, werden nicht nachverfolgt:

  • Ausführen der UPDATETEXT -Anweisung. Diese Anweisung ist veraltet und wird in einer zukünftigen Version von SQL Server entfernt. Änderungen, die mithilfe der .WRITE -Klausel der UPDATE-Anweisung vorgenommen werden, werden jedoch nachverfolgt.

  • Löschen von Zeilen mithilfe TRUNCATE TABLEvon . Wenn eine Tabelle abgeschnitten ist, werden die mit der Tabelle verknüpften Versionsinformationen der Änderungsnachverfolgung zurückgesetzt, als ob die Änderungsnachverfolgung gerade erst für die Tabelle aktiviert wurde. Eine Clientanwendung sollte immer die zuletzt synchronisierte Version überprüfen. Die Überprüfung schlägt fehl, wenn die Tabelle abgeschnitten wurde.

CHANGETABLE(VERSION...)

Ein leeres Resultset wird zurückgegeben, wenn ein nicht vorhandener Primärschlüssel angegeben wird.

Der Wert von SYS_CHANGE_VERSION kann NULL sein, wenn eine Änderung nicht länger als der Aufbewahrungszeitraum vorgenommen wurde (z. B. durch die Bereinigung wurden die Änderungsinformationen entfernt) oder die Zeile nie geändert wurde, seit die Änderungsnachverfolgung für die Tabelle aktiviert wurde.

Berechtigungen

Erfordert die SELECT Berechtigung für die Primärschlüsselspalten und VIEW CHANGE TRACKING die Berechtigung für die Tabelle, die <vom table_name-Wert> angegeben wird, um Änderungsnachverfolgungsinformationen abzurufen.

Beispiele

A. Zurückgeben von Zeilen für eine Erstsynchronisierung der Daten

Im folgenden Beispiel wird gezeigt, wie Daten für eine Erstsynchronisierung der Tabellendaten abgerufen werden. Die Abfrage gibt alle Zeilendaten und ihre zugehörigen Versionen zurück. Sie können diese Daten dann einfügen oder dem System hinzufügen, das die synchronisierten Daten enthalten soll.

-- 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. Auflisten aller Änderungen, die seit einer bestimmten Version vorgenommen wurden

Im folgenden Beispiel werden alle Änderungen aufgelistet, die seit der angegebenen Version (@last_sync_version)) in der Tabelle vorgenommen wurden. [Emp-ID] und SSN ist Spalten in einem zusammengesetzten Primärschlüssel.

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. Abrufen aller geänderten Daten für eine Synchronisierung

Im folgenden Beispiel wird gezeigt, wie Sie alle geänderten Daten abrufen können. Diese Abfrage führt die Änderungsnachverfolgungsinformationen mit der Benutzertabelle zusammen, sodass Benutzertabelleninformationen zurückgegeben werden. Ein LEFT OUTER JOIN wird verwendet, damit eine Zeile für gelöschte Zeilen zurückgegeben wird.

-- 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: Erkennen von Konflikten mit CHANGETABLE(VERSION...)

Im folgenden Beispiel wird gezeigt, wie eine Zeile nur dann aktualisiert wird, wenn sie sich seit der letzten Synchronisierung nicht geändert hat. Die Versionsnummer der betreffenden Zeile wird mit CHANGETABLE abgerufen. Wenn die Zeile aktualisiert wurde, werden keine Änderungen vorgenommen, und die Abfrage gibt Informationen über die aktuelle Änderung der Zeile zurück.

-- @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);  

Weitere Informationen

Änderungsnachverfolgungsfunktionen (Transact-SQL)
Nachverfolgen von Datenänderungen (SQL Server)
CHANGE_TRACKING_IS_COLUMN_IN_MASK (Transact-SQL)
CHANGE_TRACKING_CURRENT_VERSION (Transact-SQL)
CHANGE_TRACKING_MIN_VALID_VERSION (Transact-SQL)