CHANGETABLE (Transact-SQL)

Se aplica a:SQL ServerAzure SQL DatabaseAzure SQL Managed Instance

Devuelve información de seguimiento de cambios para una tabla. Puede utilizar esta instrucción para devolver todos los cambios de una tabla o información de seguimiento de cambios de una fila concreta.

Convenciones de sintaxis de Transact-SQL

Sintaxis

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

Argumentos

CAMBIOS table_name , last_sync_version
Devuelve información de seguimiento de todos los cambios en una tabla que se ha producido desde la versión especificada por last_sync_version.

table_name
Es la tabla definida por el usuario de la que obtener cambios a los que se ha realizado el seguimiento. El seguimiento de cambios debe estar habilitado en la tabla. Puede utilizarse un nombre de tabla de uno, dos, tres o cuatro partes. El nombre de tabla puede ser un sinónimo de la tabla.

last_sync_version
Valor escalar bigint que acepta valores NULL. Una expresión provocará un error de sintaxis. Si el valor es NULL, se devuelven todos los cambios a los que se ha realizado el seguimiento. Cuando obtiene cambios, la aplicación que realiza la llamada debe especificar el punto del que se requieren cambios. El last_sync_version especifica ese punto. La función devuelve de todas las filas que se han cambiado desde esa versión. La aplicación está consultando para recibir cambios con una versión mayor que last_sync_version. Normalmente, antes de obtener los cambios, la aplicación llamará CHANGE_TRACKING_CURRENT_VERSION() a para obtener la versión que se usará la próxima vez que se requieran cambios. Por consiguiente, la aplicación no tiene que interpretar ni conocer el valor real. Dado que la aplicación que realiza la llamada obtiene last_sync_version, la aplicación debe conservar el valor. Si la aplicación pierde este valor, será necesario reinicializar los datos. last_sync_version debe validarse para asegurarse de que no es demasiado antiguo, ya que es posible que parte o toda la información de cambio se haya limpiado según el período de retención configurado para la base de datos. Para obtener más información, vea CHANGE_TRACKING_MIN_VALID_VERSION (Transact-SQL) y opciones de ALTER DATABASE SET (Transact-SQL).

VERSION table_name, { primary_key_values }
Devuelve la última información de seguimiento de cambios para una fila especificada. Los valores de clave principal deben identificar la fila. primary_key_values identifica las columnas de clave principal y especifica los valores. Los nombres de columna de clave principal se pueden especificar en cualquier orden.

table_name
Es la tabla definida por el usuario de la que obtener la información de seguimiento de cambios. El seguimiento de cambios debe estar habilitado en la tabla. Puede utilizarse un nombre de tabla de uno, dos, tres o cuatro partes. El nombre de tabla puede ser un sinónimo de la tabla.

column_name
Especifica el nombre de la columna o columnas de clave principal. Se pueden especificar varios nombres de columna y en cualquier orden.

value
Es el valor de la clave principal. Si hay varias columnas de clave principal, los valores deben especificarse en el mismo orden que las columnas aparecen en la lista de column_name .

[ FORCESEEK ]
Se aplica a: SQL Server (a partir de SQL Server 2016 (13.x) SP2 CU16, SQL Server 2017 (14.x) CU24 y SQL Server 2019 (15.x) CU11), Azure SQL Database y Azure SQL Managed Instance

Parámetro opcional que obliga a que se use una operación de búsqueda para acceder al table_name. En algunos casos en los que han cambiado muy pocas filas, es posible que se siga usando una operación de examen para acceder al table_name. Si una operación de examen presenta un problema de rendimiento, use el FORCESEEK parámetro .

[AS] table_alias [ (column_alias [ ,... n ] ) ]
Proporciona los nombres de los resultados devueltos por CHANGETABLE.

table_alias
Es el nombre del alias de la tabla que es devuelta por CHANGETABLE. table_alias es necesario y debe ser un identificador válido.

column_alias
Es un alias de columna opcional o lista de alias de columna para las columnas devueltas por CHANGETABLE. Esto permite personalizar los nombres de columna en caso de que haya nombres duplicados en los resultados.

Tipos de valor devuelto

table

Valores devueltos

CHANGETABLE CHANGES

Si se especifica CHANGES, se devuelven cero o varias filas con las columnas siguientes.

Nombre de la columna Tipo de datos Descripción
SYS_CHANGE_VERSION bigint Valor de versión asociado al último cambio de la fila
SYS_CHANGE_CREATION_VERSION bigint Valores de versión asociados a la última operación de inserción.
SYS_CHANGE_OPERATION nchar(1) Especifica el tipo de cambio:

U = Actualizar

I = Insertar

D = Eliminar
SYS_CHANGE_COLUMNS varbinary(4100) Enumera las columnas que han cambiado desde last_sync_version (la básica). Tenga en cuenta que las columnas calculadas nunca aparecen como modificadas.

El valor es NULL si se cumple una cualquiera de las siguientes condiciones:

El seguimiento de cambios de columna no está habilitado.

Se trata de una operación de eliminación o de inserción.

Se actualizaron en una única operación todas las columnas de clave no principal. No debería interpretarse directamente este valor binario. En su lugar, para interpretarlo, use CHANGE_TRACKING_IS_COLUMN_IN_MASK().
SYS_CHANGE_CONTEXT varbinary(128) Cambie la información de contexto que puede especificar opcionalmente mediante la cláusula WITH como parte de una instrucción INSERT, UPDATE o DELETE.
<valor de columna de clave principal> Igual que las columnas de tabla de usuario Los valores de clave principal de la tabla con seguimiento. Estos valores identifican de manera única cada fila en la tabla de usuario.

CHANGETABLE VERSION

Si se especifica VERSION, se devuelve una fila con las siguientes columnas.

Nombre de la columna Tipo de datos Descripción
SYS_CHANGE_VERSION bigint Valor de versión de cambios actual asociado a la fila.

El valor es NULL si no se ha realizado ningún cambio durante un periodo más largo que el periodo de retención del seguimiento de cambios, o no se ha cambiado la fila desde que se habilitó el seguimiento de cambios.
SYS_CHANGE_CONTEXT varbinary(128) Cambie la información de contexto que se puede especificar opcionalmente usando la cláusula WITH como parte de una instrucción INSERT, UPDATE o DELETE.
<valor de columna de clave principal> Igual que las columnas de tabla de usuario Los valores de clave principal de la tabla con seguimiento. Estos valores identifican de manera única cada fila en la tabla de usuario.

Comentarios

Normalmente, la función CHANGETABLE se utiliza en la cláusula FROM de una consulta como si fuera una tabla.

CHANGETABLE(CHANGES...)

Para obtener los datos de fila para las filas nuevas o modificadas, una el conjunto de resultados a la tabla de usuario mediante las columnas de clave principal. Solo se devuelve una fila para cada fila de la tabla de usuario que se ha cambiado, aunque haya habido varios cambios en la misma fila desde el valor de last_sync_version .

Los cambios de la columna de clave principal nunca se marcan como actualizaciones. Si un valor de clave principal cambia, se considera que es una eliminación del valor anterior y una inserción del valor nuevo.

Si elimina una fila y, a continuación, inserta una fila con la clave principal anterior, el cambio se considera una actualización para todas las columnas de la fila.

Los valores que se devuelven para las SYS_CHANGE_OPERATION columnas y SYS_CHANGE_COLUMNS son relativos a la línea base (last_sync_version) que se especifica. Por ejemplo, si se realizó una operación de inserción en la versión 10 y una operación de actualización en la versión 15, y si la línea base last_sync_version es 12, se notificará una actualización. Si el valor last_sync_version es 8, se notificará una inserción. SYS_CHANGE_COLUMNS nunca notificará columnas calculadas como si hubieran sido actualizadas.

Generalmente, se someten a seguimiento todas las operaciones que insertan, actualizan o eliminan datos en tablas de usuario, incluida la instrucción MERGE.

Las siguientes operaciones, que afectan a datos de tablas de usuario, no se someten a seguimiento:

  • Ejecución de la UPDATETEXT instrucción . Esta instrucción está en desuso y se quitará en una versión futura de SQL Server. Sin embargo, se realiza un seguimiento de los cambios realizados mediante la .WRITE cláusula de la instrucción UPDATE.

  • Eliminación de filas mediante TRUNCATE TABLE. Cuando se trunca una tabla, la información de versión del seguimiento de cambios asociada a la tabla se restablece como si el seguimiento de cambios se hubiera habilitado recientemente en la tabla. Una aplicación cliente debe validar siempre su última versión sincronizada. Se producirá un error en la validación si se ha truncado la tabla.

CHANGETABLE(VERSION...)

Se devuelve un conjunto de resultados vacío si se especifica una clave principal inexistente.

El valor de SYS_CHANGE_VERSION puede ser NULL si no se ha realizado un cambio durante más tiempo que el período de retención (por ejemplo, la limpieza ha quitado la información de cambio) o la fila nunca se ha cambiado desde que se ha habilitado el seguimiento de cambios para la tabla.

Permisos

Requiere el SELECT permiso en las columnas de clave principal y VIEW CHANGE TRACKING el permiso en la tabla especificada por el <valor de table_name> para obtener información de seguimiento de cambios.

Ejemplos

A. Devolver las filas de una sincronización inicial de los datos

El ejemplo siguiente obtiene los datos para una sincronización inicial de los datos de la tabla. La consulta devuelve todos los datos de fila y sus versiones asociadas. A continuación, pueden insertarse o agregarse estos datos al sistema que contendrá los datos sincronizados.

-- 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. Enumerar todos los cambios realizados desde una versión concreta

El siguiente ejemplo enumera todos los cambios realizados en una tabla desde una versión concreta (@last_sync_version). [Emp ID] y SSN son las columnas de una clave principal compuesta.

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. Obtener todos los datos cambiados para una sincronización

El siguiente ejemplo muestra cómo se pueden obtener todos los datos que han cambiado. Esta consulta une la información del seguimiento de cambios con la tabla de usuario para devolver la información de tabla de usuario. Una LEFT OUTER JOIN se usa para devolver una fila para las filas eliminadas.

-- 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. Detectar conflictos mediante CHANGETABLE (VERSION...)

El siguiente ejemplo actualiza una fila solo si la fila no ha cambiado desde la última sincronización. El número de versión de la fila concreta se obtiene mediante CHANGETABLE. Si se ha actualizado la fila, no se realizan los cambios y la consulta devuelve información sobre el último cambio de la fila.

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

Consulte también

Funciones de seguimiento de cambios (Transact-SQL)
Seguimiento de cambios de datos (SQL Server)
CHANGE_TRACKING_IS_COLUMN_IN_MASK (Transact-SQL)
CHANGE_TRACKING_CURRENT_VERSION (Transact-SQL)
CHANGE_TRACKING_MIN_VALID_VERSION (Transact-SQL)