CHANGETABLE (Transact-SQL)CHANGETABLE (Transact-SQL)

ESTE TEMA SE APLICA A:síSQL Server (a partir de 2008)síAzure SQL DatabasenoAzure SQL Data Warehouse noAlmacenamiento de datos paralelos THIS TOPIC APPLIES TO:yesSQL Server (starting with 2008)yesAzure SQL DatabasenoAzure SQL Data Warehouse noParallel Data Warehouse

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.Returns change tracking information for a table.You can use this statement to return all changes for a table or change tracking information for a specific row.

Icono de vínculo de tema Convenciones de sintaxis de Transact-SQLTopic link icon Transact-SQL Syntax Conventions

SintaxisSyntax

CHANGETABLE (  
    { CHANGES table , last_sync_version  
    | VERSION table , <primary_key_values> } )  
[AS] table_alias [ ( column_alias [ ,...n ] )  

<primary_key_values> ::=  
( column_name [ , ...n ] ) , ( value [ , ...n ] )  

ArgumentosArguments

Los cambios tabla , last_sync_versionCHANGES table , last_sync_version
Devuelve información de seguimiento para todos los cambios a una tabla que se ha producido desde la versión especificada por last_sync_version.Returns tracking information for all changes to a table that have occurred since the version that is specified by last_sync_version.

tabletable
Es la tabla definida por el usuario de la que obtener cambios a los que se ha realizado el seguimiento.Is the user-defined table on which to obtain tracked changes. El seguimiento de cambios debe estar habilitado en la tabla.Change tracking must be enabled on the table. Puede utilizarse un nombre de tabla de uno, dos, tres o cuatro partes.A one-, two-, three-, or four-part table name can be used. El nombre de tabla puede ser un sinónimo de la tabla.The table name can be a synonym to the table.

last_sync_versionlast_sync_version
Cuando obtiene cambios, la aplicación que realiza la llamada debe especificar el punto del que se requieren cambios.When it obtains changes, the calling application must specify the point from which changes are required. El parámetro last_sync_version especifica ese punto.The last_sync_version specifies that point. La función devuelve de todas las filas que se han cambiado desde esa versión.The function returns information for all rows that have been changed since that version. La aplicación consulta la recepción de cambios con una versión superior a last_sync_version.The application is querying to receive changes with a version greater than last_sync_version.

Normalmente, antes de obtener cambios, la aplicación llamará change_tracking_current_version () para obtener la versión que se usarán los cambios de tiempo siguientes son necesarios.Typically, before it obtains changes, the application will call CHANGE_TRACKING_CURRENT_VERSION() to obtain the version that will be used the next time changes are required. Por consiguiente, la aplicación no tiene que interpretar ni conocer el valor real.Therefore, the application does not have to interpret or understand the actual value.

Dado que el valor de last_sync_version lo obtiene la aplicación que realiza la llamada, la aplicación tiene que conservar el valor.Because last_sync_version is obtained by the calling application, the application has to persist the value. Si la aplicación pierde este valor, será necesario reinicializar los datos.If the application loses this value then it will need to re-initialize data.

last_sync_version es bigint.last_sync_version is bigint. El valor debe ser escalar.The value must be scalar. Una expresión producirá un error de sintaxis.An expression will cause a syntax error.

Si el valor es NULL, se devuelven todos los cambios a los que se ha realizado el seguimiento.If the value is NULL, all tracked changes are returned.

last_sync_version debe validarse para asegurarse de que no es demasiado antigua, ya que algunas o todas la información de cambios es posible que se han limpiado según el período de retención configurado para la base de datos.last_sync_version should be validated to ensure that it is not too old, because some or all the change information might have been cleaned up according to the retention period configured for the database. Para obtener más información, consulte CHANGE_TRACKING_MIN_VALID_VERSION (Transact-SQL) y ALTER DATABASE SET Options (Transact-SQL).For more information, see CHANGE_TRACKING_MIN_VALID_VERSION (Transact-SQL) and ALTER DATABASE SET Options (Transact-SQL).

VERSIÓN tabla, {< primary_key_values >}VERSION table, { <primary_key_values> }
Devuelve la última información de seguimiento de cambios para una fila especificada.Returns the latest change tracking information for a specified row. Los valores de clave principal deben identificar la fila.Primary key values must identify the row. <primary_key_values> identifica las columnas de clave principal y especifica los valores.<primary_key_values> identifies the primary key columns and specifies the values. Los nombres de columna de clave principal se pueden especificar en cualquier orden.The primary key column names can be specified in any order.

TableTable
Es la tabla definida por el usuario de la que obtener la información de seguimiento de cambios.Is the user-defined table on which to obtain change tracking information. El seguimiento de cambios debe estar habilitado en la tabla.Change tracking must be enabled on the table. Puede utilizarse un nombre de tabla de uno, dos, tres o cuatro partes.A one-, two-, three-, or four-part table name can be used. El nombre de tabla puede ser un sinónimo de la tabla.The table name can be a synonym to the table.

column_namecolumn_name
Especifica el nombre de la columna o columnas de clave principal.Specifies the name of primary key column or columns. Se pueden especificar varios nombres de columna y en cualquier orden.Multiple column names can be specified in any order.

ValueValue
Es el valor de la clave principal.Is the value of the primary key. Si hay varias columnas de clave principales, deben especificarse los valores en el mismo orden que aparecen las columnas en el column_name lista.If there are multiple primary key columns, the values must be specified in the same order as the columns appear in the column_name list.

[COMO] table_alias [(column_alias [,... n ])][AS] table_alias [ (column_alias [ ,...n ] ) ]
Proporciona los nombres de los resultados devueltos por CHANGETABLE.Provides names for the results that are returned by CHANGETABLE.

table_aliastable_alias
Es el nombre del alias de la tabla que es devuelta por CHANGETABLE.Is the alias name of the table that is returned by CHANGETABLE. table_alias es obligatorio y debe ser válido identificador.table_alias is required and must be a valid identifier.

column_aliascolumn_alias
Es un alias de columna opcional o lista de alias de columna para las columnas devueltas por CHANGETABLE.Is an optional column alias or list of column aliases for the columns that are returned by CHANGETABLE. Esto permite personalizar los nombres de columna en caso de que haya nombres duplicados en los resultados.This enables column names to be customized in case there are duplicate names in the results.

Tipos devueltosReturn Types

tabletable

Valores devueltosReturn Values

CHANGETABLE CHANGESCHANGETABLE CHANGES

Si se especifica CHANGES, se devuelven cero o varias filas con las columnas siguientes.When CHANGES is specified, zero or more rows that have the following columns are returned.

Nombre de columnaColumn name Tipo de datosData type DescripciónDescription
SYS_CHANGE_VERSIONSYS_CHANGE_VERSION bigintbigint Valor de versión asociado al último cambio de la filaVersion value that is associated with the last change to the row
SYS_CHANGE_CREATION_VERSIONSYS_CHANGE_CREATION_VERSION bigintbigint Valores de versión asociados a la última operación de inserción.Version values that are associated with the last insert operation.
SYS_CHANGE_OPERATIONSYS_CHANGE_OPERATION nchar (1)nchar(1) Especifica el tipo de cambio:Specifies the type of change:

U = actualizarU = Update

Puedo = inserciónI = Insert

D. = DeleteD = Delete
SYS_CHANGE_COLUMNSSYS_CHANGE_COLUMNS varbinary(4100)varbinary(4100) Enumera las columnas que han cambiado desde last_sync_version (la básica).Lists the columns that have changed since the last_sync_version (the baseline). Tenga en cuenta que las columnas calculadas nunca se presentan como cambiadas.Note that computed columns are never listed as changed.

El valor es NULL si se cumple una cualquiera de las siguientes condiciones:The value is NULL when any one of the following conditions is true:

El seguimiento de cambios de columna no está habilitado.Column change tracking is not enabled.

Se trata de una operación de eliminación o de inserción.The operation is an insert or delete operation.

Se actualizaron en una única operación todas las columnas de clave no principal.All nonprimary key columns were updated in one operation. No debería interpretarse directamente este valor binario.This binary value should not be interpreted directly. En su lugar, para interpretarlo utilice change_tracking_is_column_in_mask ().Instead, to interpret it, use CHANGE_TRACKING_IS_COLUMN_IN_MASK().
SYS_CHANGE_CONTEXTSYS_CHANGE_CONTEXT varbinary(128)varbinary(128) Cambiar la información de contexto que puede especificar opcionalmente usando la WITH cláusula como parte de una instrucción INSERT, UPDATE o DELETE.Change context information that you can optionally specify by using the WITH clause as part of an INSERT, UPDATE, or DELETE statement.
<valor de columna de clave principal ><primary key column value> Igual que las columnas de tabla de usuarioSame as the user table columns Los valores de clave principal de la tabla con seguimiento.The primary key values for the tracked table. Estos valores identifican de manera única cada fila en la tabla de usuario.These values uniquely identify each row in the user table.

CHANGETABLE VERSIONCHANGETABLE VERSION

Si se especifica VERSION, se devuelve una fila con las siguientes columnas.When VERSION is specified, one row that has the following columns is returned.

Nombre de columnaColumn name Tipo de datosData type DescripciónDescription
SYS_CHANGE_VERSIONSYS_CHANGE_VERSION bigintbigint Valor de versión de cambios actual asociado a la fila.Current change version value that is associated with the row.

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.The value is NULL if a change has not been made for a period longer than the change tracking retention period, or the row has not been changed since change tracking was enabled.
SYS_CHANGE_CONTEXTSYS_CHANGE_CONTEXT varbinary(128)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.Change context information that you can optionally specify by using the WITH clause as part of an INSERT, UPDATE, or DELETE statement.
<valor de columna de clave principal ><primary key column value> Igual que las columnas de tabla de usuarioSame as the user table columns Los valores de clave principal de la tabla con seguimiento.The primary key values for the tracked table. Estos valores identifican de manera única cada fila en la tabla de usuario.These values uniquely identify each row in the user table.

NotasRemarks

Normalmente, la función CHANGETABLE se utiliza en la cláusula FROM de una consulta como si fuera una tabla.The CHANGETABLE function is typically used in the FROM clause of a query as if it were a table.

CHANGETABLE(CHANGES...)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.To obtain row data for new or modified rows, join the result set to the user table by using the primary key columns. Se devuelve solo una fila para cada fila de la tabla de usuario que ha cambiado, incluso si ha habido varios cambios en la misma fila desde la last_sync_version valor.Only one row is returned for each row in the user table that has been changed, even if there have been multiple changes to the same row since the last_sync_version value.

Los cambios de la columna de clave principal nunca se marcan como actualizaciones.Primary key column changes are never marked as updates. Si un valor de clave principal cambia, se considera que es una eliminación del valor anterior y una inserción del valor nuevo.If a primary key value changes, it is considered to be a delete of the old value and an insert of the new value.

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.If you delete a row and then insert a row that has the old primary key, the change is seen as an update to all columns in the row.

Los valores devueltos para las columnas SYS_CHANGE_OPERATION y SYS_CHANGE_COLUMNS son relativos la básica (last_sync_version) especificada.The values that are returned for the SYS_CHANGE_OPERATION and SYS_CHANGE_COLUMNS columns are relative to the baseline (last_sync_version) that is specified. Por ejemplo, si se realiza 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 de base last_sync_version es 12, se notificará una actualización.For example, if an insert operation was made at version 10 and an update operation at version 15, and if the baseline last_sync_version is 12, an update will be reported. Si el last_sync_version valor es 8, se notificará una inserción.If the last_sync_version value is 8, an insert will be reported. SYS_CHANGE_COLUMNS nunca notificará columnas calculadas como si hubieran sido actualizadas.SYS_CHANGE_COLUMNS will never report computed columns as having been updated.

Generalmente, se someten a seguimiento todas las operaciones que insertan, actualizan o eliminan datos en tablas de usuario, incluida la instrucción MERGE.Generally, all operations that insert, update, or delete of data in user tables are tracked, including the MERGE statement.

Las siguientes operaciones, que afectan a datos de tablas de usuario, no se someten a seguimiento:The following operations that affect user table data are not tracked:

  • Ejecutar la instrucción UPDATETEXTExecuting the UPDATETEXT statement

    Esta instrucción ha quedado desusada y no estará presente en una versión futura de SQL ServerSQL Server.This statement is deprecated and will be removed in a future version of SQL ServerSQL Server. Sin embargo, sí se realiza el seguimiento de los cambios realizados mediante la cláusula .WRITE de la instrucción UPDATE.However, changes that are made by using the .WRITE clause of the UPDATE statement are tracked.

  • Eliminar filas mediante TRUNCATE TABLEDeleting rows by using 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.When a table is truncated, the change tracking version information that is associated with the table is reset as if change tracking has just been enabled on the table. Una aplicación cliente debe validar siempre su última versión sincronizada.A client application should always validate its last synchronized version. Se producirá un error en la validación si se ha truncado la tabla.The validation fails if the table has been truncated.

CHANGETABLE(VERSION...)CHANGETABLE(VERSION...)

Se devuelve un conjunto de resultados vacío si se especifica una clave principal inexistente.An empty result set is returned if a nonexistent primary key is specified.

El valor de SYS_CHANGE_VERSION podría ser NULL si lleva sin realizarse un cambio más tiempo del correspondiente al período de retención (por ejemplo, la limpieza ha quitado la información de los cambios) o si la fila nunca ha cambiado desde que el seguimiento de cambios se habilitó en la tabla.The value of SYS_CHANGE_VERSION might be NULL if a change has not been made for longer than the retention period (for example, the cleanup has removed the change information) or the row has never been changed since change tracking was enabled for the table.

PermisosPermissions

Requiere los siguientes permisos en la tabla especificada por el tabla valor para obtener información de seguimiento de cambios:Requires the following permissions on the table that is specified by the table value to obtain change tracking information:

  • Permiso SELECT en las columnas de clave principalSELECT permission on the primary key columns

  • VIEW CHANGE TRACKINGVIEW CHANGE TRACKING

EjemplosExamples

A.A. Devolver las filas de una sincronización inicial de los datosReturning rows for an initial synchronization of data

El ejemplo siguiente obtiene los datos para una sincronización inicial de los datos de la tabla.The following example shows how to obtain data for an initial synchronization of the table data. La consulta devuelve todos los datos de fila y sus versiones asociadas.The query returns all row data and their associated versions. A continuación, pueden insertarse o agregarse estos datos al sistema que contendrá los datos sincronizados.You can then insert or add this data to the system that will contain the synchronized data.

-- 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.B. Enumerar todos los cambios realizados desde una versión concretaListing all changes that were made since a specific version

El siguiente ejemplo enumera todos los cambios realizados en una tabla desde una versión concreta (@last_sync_version).The following example lists all changes that were made in a table since the specified version (@last_sync_version). [Emp ID] y SSN son las columnas de una clave principal compuesta.[Emp ID] and SSN are columns in a composite primary key.

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.C. Obtener todos los datos cambiados para una sincronizaciónObtaining all changed data for a synchronization

El siguiente ejemplo muestra cómo se pueden obtener todos los datos que han cambiado.The following example shows how you can obtain all data that has changed. Esta consulta une la información del seguimiento de cambios con la tabla de usuario para devolver la información de tabla de usuario.This query joins the change tracking information with the user table so that user table information is returned. Una LEFT OUTER JOIN se usa para devolver una fila para las filas eliminadas.A LEFT OUTER JOIN is used so that a row is returned for deleted rows.

-- 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.D. Detectar conflictos mediante CHANGETABLE (VERSION...)Detecting conflicts by using CHANGETABLE(VERSION...)

El siguiente ejemplo actualiza una fila solo si la fila no ha cambiado desde la última sincronización.The following example shows how to update a row only if the row has not changed since the last synchronization. El número de versión de la fila concreta se obtiene mediante CHANGETABLE.The version number of the specific row is obtained by using 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.If the row has been updated, changes are not made and the query returns information about the most recent change to the row.

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

Vea tambiénSee Also

Funciones de seguimiento de cambios (Transact-SQL) Change Tracking Functions (Transact-SQL)
Seguimiento de cambios de datos (SQL Server) Track Data Changes (SQL Server)
CHANGE_TRACKING_IS_COLUMN_IN_MASK (Transact-SQL) CHANGE_TRACKING_IS_COLUMN_IN_MASK (Transact-SQL)
CHANGE_TRACKING_CURRENT_VERSION (Transact-SQL) CHANGE_TRACKING_CURRENT_VERSION (Transact-SQL)
CHANGE_TRACKING_MIN_VALID_VERSION (Transact-SQL)CHANGE_TRACKING_MIN_VALID_VERSION (Transact-SQL)