ALTER TABLE (Transact-SQL)ALTER TABLE (Transact-SQL)

SE APLICA A: síSQL Server síAzure SQL Database síAzure SQL Data Warehouse síAlmacenamiento de datos paralelos APPLIES TO: yesSQL Server yesAzure SQL Database yesAzure SQL Data Warehouse yesParallel Data Warehouse

Modifica una definición de tabla mediante la alteración, adición o retirada de columnas y restricciones.Modifies a table definition by altering, adding, or dropping columns and constraints. ALTER TABLE también vuelve a asignar y compilar particiones, o deshabilita y habilita restricciones y desencadenadores.ALTER TABLE also reassigns and rebuilds partitions, or disables and enables constraints and triggers.

Para obtener más información sobre las convenciones de sintaxis, vea Convenciones de sintaxis de Transact-SQL.For more information about the syntax conventions, see Transact-SQL Syntax Conventions.

Importante

La sintaxis de ALTER TABLE es diferente para las tablas basadas en disco y las tablas optimizadas para memoria.The syntax for ALTER TABLE is different for disk-based tables and memory-optimized tables. Utilice los siguientes vínculos para acceder directamente al bloque de sintaxis apropiado para los tipos de tabla y a los ejemplos de sintaxis apropiados:Use the following links to take you directly to the appropriate syntax block for your table types and to the appropriate syntax examples:

Sintaxis para las tablas basadas en discoSyntax for disk-based tables

ALTER TABLE { database_name.schema_name.table_name | schema_name.table_name | table_name }
{
    ALTER COLUMN column_name
    {
        [ type_schema_name. ] type_name
            [ (
                {
                   precision [ , scale ]
                 | max
                 | xml_schema_collection
                }
            ) ]
        [ COLLATE collation_name ]
        [ NULL | NOT NULL ] [ SPARSE ]
      | { ADD | DROP }
          { ROWGUIDCOL | PERSISTED | NOT FOR REPLICATION | SPARSE | HIDDEN }
      | { ADD | DROP } MASKED [ WITH ( FUNCTION = ' mask_function ') ]
    }
    [ WITH ( ONLINE = ON | OFF ) ]
    | [ WITH { CHECK | NOCHECK } ]
  
    | ADD
    {
        <column_definition>
      | <computed_column_definition>
      | <table_constraint>
      | <column_set_definition>
    } [ ,...n ]
      | [ system_start_time_column_name datetime2 GENERATED ALWAYS AS ROW START
                [ HIDDEN ] [ NOT NULL ] [ CONSTRAINT constraint_name ]
            DEFAULT constant_expression [WITH VALUES] ,
                system_end_time_column_name datetime2 GENERATED ALWAYS AS ROW END
                   [ HIDDEN ] [ NOT NULL ][ CONSTRAINT constraint_name ]
            DEFAULT constant_expression [WITH VALUES] ,
        ]
       PERIOD FOR SYSTEM_TIME ( system_start_time_column_name, system_end_time_column_name )
    | DROP
     [ {
         [ CONSTRAINT ][ IF EXISTS ]
         {
              constraint_name
              [ WITH
               ( <drop_clustered_constraint_option> [ ,...n ] )
              ]
          } [ ,...n ]
          | COLUMN [ IF EXISTS ]
          {
              column_name
          } [ ,...n ]
          | PERIOD FOR SYSTEM_TIME
     } [ ,...n ]
    | [ WITH { CHECK | NOCHECK } ] { CHECK | NOCHECK } CONSTRAINT
        { ALL | constraint_name [ ,...n ] }
  
    | { ENABLE | DISABLE } TRIGGER
        { ALL | trigger_name [ ,...n ] }
  
    | { ENABLE | DISABLE } CHANGE_TRACKING
        [ WITH ( TRACK_COLUMNS_UPDATED = { ON | OFF } ) ]
  
    | SWITCH [ PARTITION source_partition_number_expression ]
        TO target_table
        [ PARTITION target_partition_number_expression ]
        [ WITH ( <low_priority_lock_wait> ) ]

    | SET
        (
            [ FILESTREAM_ON =
                { partition_scheme_name | filegroup | "default" | "NULL" } ]
            | SYSTEM_VERSIONING =
                  {
                      OFF
                  | ON
                      [ ( HISTORY_TABLE = schema_name . history_table_name
                          [, DATA_CONSISTENCY_CHECK = { ON | OFF } ]
                          [, HISTORY_RETENTION_PERIOD =
                          {
                              INFINITE | number {DAY | DAYS | WEEK | WEEKS
                  | MONTH | MONTHS | YEAR | YEARS }
                          }
                          ]
                        )
                      ]
                  }
          )

    | REBUILD
      [ [PARTITION = ALL]
        [ WITH ( <rebuild_option> [ ,...n ] ) ]
      | [ PARTITION = partition_number
           [ WITH ( <single_partition_rebuild_option> [ ,...n ] ) ]
        ]
      ]
  
    | <table_option>
    | <filetable_option>
    | <stretch_configuration>
}
[ ; ]
  
-- ALTER TABLE options
  
<column_set_definition> ::=
    column_set_name XML COLUMN_SET FOR ALL_SPARSE_COLUMNS

<drop_clustered_constraint_option> ::=
    {
        MAXDOP = max_degree_of_parallelism
      | ONLINE = { ON | OFF }
      | MOVE TO
         { partition_scheme_name ( column_name ) | filegroup | "default" }
    }
<table_option> ::=
    {
        SET ( LOCK_ESCALATION = { AUTO | TABLE | DISABLE } )
    }
  
<filetable_option> ::=
    {
       [ { ENABLE | DISABLE } FILETABLE_NAMESPACE ]
       [ SET ( FILETABLE_DIRECTORY = directory_name ) ]
    }
  
<stretch_configuration> ::=
    {
      SET (
        REMOTE_DATA_ARCHIVE
        {
            = ON (<table_stretch_options>)
          | = OFF_WITHOUT_DATA_RECOVERY ( MIGRATION_STATE = PAUSED )
          | ( <table_stretch_options> [, ...n] )
        }
            )
    }
  
<table_stretch_options> ::=
    {
     [ FILTER_PREDICATE = { null | table_predicate_function } , ]
       MIGRATION_STATE = { OUTBOUND | INBOUND | PAUSED }
    }
  
<single_partition_rebuild__option> ::=
{
      SORT_IN_TEMPDB = { ON | OFF }
    | MAXDOP = max_degree_of_parallelism
    | DATA_COMPRESSION = { NONE | ROW | PAGE | COLUMNSTORE | COLUMNSTORE_ARCHIVE} }
    | ONLINE = { ON [( <low_priority_lock_wait> ) ] | OFF }
}
  
<low_priority_lock_wait>::=
{
    WAIT_AT_LOW_PRIORITY ( MAX_DURATION = <time> [ MINUTES ],
        ABORT_AFTER_WAIT = { NONE | SELF | BLOCKERS } )
}

Sintaxis para las tablas optimizadas para memoriaSyntax for memory-optimized tables

ALTER TABLE { database_name.schema_name.table_name | schema_name.table_name | table_name }
{
    ALTER COLUMN column_name
    {
        [ type_schema_name. ] type_name
            [ (
                {
                   precision [ , scale ]
                }
            ) ]
        [ COLLATE collation_name ]
        [ NULL | NOT NULL ]
    }

    | ALTER INDEX index_name
    {
        [ type_schema_name. ] type_name
        REBUILD
        [ [ NONCLUSTERED ] WITH ( BUCKET_COUNT = bucket_count )
        ]
    }

    | ADD
    {
        <column_definition>
      | <computed_column_definition>
      | <table_constraint>
      | <table_index>
      | <column_index>
    } [ ,...n ]
      | [ system_start_time_column_name datetime2 GENERATED ALWAYS AS ROW START
                   [ HIDDEN ] [ NOT NULL ] [ CONSTRAINT constraint_name ]
          DEFAULT constant_expression [WITH VALUES] ,
            system_end_time_column_name datetime2 GENERATED ALWAYS AS ROW END
                   [ HIDDEN ] [ NOT NULL ][ CONSTRAINT constraint_name ]
          DEFAULT constant_expression [WITH VALUES] ,
         ]
       PERIOD FOR SYSTEM_TIME ( system_start_time_column_name, system_end_time_column_name )

    | DROP
     [ {
         CONSTRAINT [ IF EXISTS ]
         {
              constraint_name
          } [ ,...n ]
        | INDEX [ IF EXISTS ]
      {
         index_name
       } [ ,...n ]
          | COLUMN [ IF EXISTS ]
          {
              column_name
          } [ ,...n ]
          | PERIOD FOR SYSTEM_TIME
     } [ ,...n ]
    | [ WITH { CHECK | NOCHECK } ] { CHECK | NOCHECK } CONSTRAINT
        { ALL | constraint_name [ ,...n ] }

    | { ENABLE | DISABLE } TRIGGER
        { ALL | trigger_name [ ,...n ] }
  
    | SWITCH [ [ PARTITION ] source_partition_number_expression ]
        TO target_table
        [ PARTITION target_partition_number_expression ]
        [ WITH ( <low_priority_lock_wait> ) ]

    | SET
        (
            SYSTEM_VERSIONING =
                  {
                      OFF
                  | ON
                      [ ( HISTORY_TABLE = schema_name . history_table_name
                          [, DATA_CONSISTENCY_CHECK = { ON | OFF } ]
                          [, HISTORY_RETENTION_PERIOD =
                          {
                              INFINITE | number {DAY | DAYS | WEEK | WEEKS
                               | MONTH | MONTHS | YEAR | YEARS }
                          }
                          ]
                        )
                      ]
                  }
          )

    | <table_option>
}
[ ; ]

-- ALTER TABLE options

< table_constraint > ::=
 [ CONSTRAINT constraint_name ]
{
   {PRIMARY KEY | UNIQUE }
     {
       NONCLUSTERED (column [ ASC | DESC ] [ ,... n ])
       | NONCLUSTERED HASH (column [ ,... n ] ) WITH ( BUCKET_COUNT = bucket_count )
                    }
    | FOREIGN KEY
        ( column [ ,...n ] )
        REFERENCES referenced_table_name [ ( ref_column [ ,...n ] ) ]
    | CHECK ( logical_expression )
}

<column_index> ::=
  INDEX index_name
{ [ NONCLUSTERED ] | [ NONCLUSTERED ] HASH WITH (BUCKET_COUNT = bucket_count)}

<table_index> ::=
  INDEX index_name
{[ NONCLUSTERED ] HASH (column [ ,... n ] ) WITH (BUCKET_COUNT = bucket_count)
  | [ NONCLUSTERED ] (column [ ASC | DESC ] [ ,... n ] )
      [ ON filegroup_name | default ]
  | CLUSTERED COLUMNSTORE [WITH ( COMPRESSION_DELAY = {0 | delay [Minutes]})]
      [ ON filegroup_name | default ]
}

<table_option> ::=
{
    MEMORY_OPTIMIZED = ON
  | DURABILITY = {SCHEMA_ONLY | SCHEMA_AND_DATA}
  | SYSTEM_VERSIONING = ON [ ( HISTORY_TABLE = schema_name . history_table_name
        [, DATA_CONSISTENCY_CHECK = { ON | OFF } ] ) ]
}

-- Syntax for Azure SQL Data Warehouse and Analytics Platform System

ALTER TABLE { database_name.schema_name.source_table_name | schema_name.source_table_name | source_table_name }
{
    ALTER COLUMN column_name
        {
            type_name [ ( precision [ , scale ] ) ]
            [ COLLATE Windows_collation_name ]
            [ NULL | NOT NULL ]
        }
    | ADD { <column_definition> | <column_constraint> FOR column_name} [ ,...n ]
    | DROP { COLUMN column_name | [CONSTRAINT] constraint_name } [ ,...n ]
    | REBUILD {
            [ PARTITION = ALL [ WITH ( <rebuild_option> ) ] ]
          | [ PARTITION = partition_number [ WITH ( <single_partition_rebuild_option> ] ]
      }
    | { SPLIT | MERGE } RANGE (boundary_value)
    | SWITCH [ PARTITION source_partition_number
        TO target_table_name [ PARTITION target_partition_number ] [ WITH ( TRUNCATE_TARGET = ON | OFF )
}
[;]

<column_definition>::=
{
    column_name
    type_name [ ( precision [ , scale ] ) ]
    [ <column_constraint> ]
    [ COLLATE Windows_collation_name ]
    [ NULL | NOT NULL ]
}

<column_constraint>::=
    [ CONSTRAINT constraint_name ] DEFAULT constant_expression

<rebuild_option > ::=
{
    DATA_COMPRESSION = { COLUMNSTORE | COLUMNSTORE_ARCHIVE }
        [ ON PARTITIONS ( {<partition_number> [ TO <partition_number>] } [ , ...n ] ) ]
}

<single_partition_rebuild_option > ::=
{
    DATA_COMPRESSION = { COLUMNSTORE | COLUMNSTORE_ARCHIVE }
}

ArgumentosArguments

database_namedatabase_name
El nombre de la base de datos en la que se creó la tabla.The name of the database in which the table was created.

schema_nameschema_name
El nombre del esquema al que pertenece la tabla.The name of the schema to which the table belongs.

table_nametable_name
El nombre de la tabla que se va a modificar.The name of the table to be altered. Si la tabla no escla base de datos actual o no está contenida en el esquema propiedad del usuario actual, la base de datos y el esquema deben especificarse explícitamente.If the table isn't in the current database or contained by the schema owned by the current user, you must explicitly specify the database and schema.

ALTER COLUMNALTER COLUMN
Especifica que la columna con nombre se va a cambiar o modificar.Specifies that the named column is to be changed or altered.

La columna modificada no puede ser:The modified column can't be:

  • Una columna con un tipo de datos timestamp.A column with a timestamp data type.

  • La columna ROWGUIDCOL de la tabla.The ROWGUIDCOL for the table.

  • Una columna calculada o usada en una columna calculada.A computed column or used in a computed column.

  • Se usa en las estadísticas generadas por la instrucción CREATE STATISTICS.Used in statistics generated by the CREATE STATISTICS statement. A menos que la columna sea un tipo de datos varchar, nvarchar o varbinary, el tipo de datos no cambia.Unless the column is a varchar, nvarchar, or varbinary data type, the data type isn't changed. Y el nuevo tamaño es igual o mayor que el tamaño anterior.And, the new size is equal to or greater than the old size. O bien, si se cambia la columna de "not null" a "null".Or, if the column is changed from not null to null. Quite primero las estadísticas con la instrucción DROP STATISTICS.First, remove the statistics using the DROP STATISTICS statement.

    Nota

    Las estadísticas generadas automáticamente por el optimizador de consultas se quitan automáticamente con ALTER COLUMN.Statistics that are automatically generated by the query optimizer are automatically dropped by ALTER COLUMN.

  • Una columna utilizada en una restricción PRIMARY KEY o [FOREIGN KEY] REFERENCES.Used in a PRIMARY KEY or [FOREIGN KEY] REFERENCES constraint.

  • Una columna utilizada en una restricción CHECK o UNIQUE.Used in a CHECK or UNIQUE constraint. Sin embargo, se permite el cambio de longitud de una columna de longitud variable en una restricción CHECK o UNIQUE.But, changing the length of a variable-length column used in a CHECK or UNIQUE constraint is allowed.

  • Una columna asociada a la definición predeterminada.Associated with a default definition. No obstante, la longitud, precisión o escala de una columna puede cambiarse si el tipo de datos no se cambia.However, the length, precision, or scale of a column can be changed if the data type isn't changed.

El tipo de datos de las columnas text, ntext e image solo se puede cambiar de las formas siguientes:The data type of text, ntext, and image columns can be changed only in the following ways:

  • text por varchar(max) , nvarchar(max) o xmltext to varchar(max), nvarchar(max), or xml
  • ntext por varchar(max) , nvarchar(max) o xmlntext to varchar(max), nvarchar(max), or xml
  • image por varbinary(max)image to varbinary(max)

Algunos cambios del tipo de datos podrían suponer un cambio en los datos.Some data type changes may cause a change in the data. Por ejemplo, cambiar una columna nchar o nvarchar por char o varchar puede provocar la conversión de caracteres extendidos.For example, changing a nchar or nvarchar column, to char or varchar, might cause the conversion of extended characters. Para obtener más información, vea CAST y CONVERT.For more information, see CAST and CONVERT. Reducir la precisión o escala de una columna puede dar como resultado que se trunquen los datos.Reducing the precision or scale of a column can cause data truncation.

Nota

El tipo de datos de una columna de una tabla con particiones no puede cambiarse.The data type of a column of a partitioned table can't be changed.

El tipo de datos de las columnas incluidas en un índice no puede cambiarse, a menos que la columna sea del tipo de datos varchar, nvarchar o varbinary y que el nuevo tamaño sea igual o mayor que el tamaño anterior.The data type of columns included in an index can't be changed unless the column is a varchar, nvarchar, or varbinary data type, and the new size is equal to or larger than the old size.

Las columnas incluidas en una restricción de clave principal no se pueden cambiar de NOT NULL a NULL.A column included in a primary key constraint, can't be changed from NOT NULL to NULL.

Al utilizar Always Encrypted (sin enclaves seguros), si la columna que se está modificando se cifra mediante "ENCRYPTED WITH", puede cambiar el tipo de datos por un tipo de datos compatible (como INT por BIGINT), pero no se puede cambiar cualquier valor de cifrado.When using Always Encrypted (without secure enclaves), if the column being modified is encrypted with 'ENCRYPTED WITH', you can change the datatype to a compatible datatype (such as INT to BIGINT), but you can't change any encryption settings.

Al usar Always Encrypted con enclaves seguros, puede cambiar cualquier configuración de cifrado, si la clave de cifrado de columna que protege la columna (y la nueva clave de cifrado de columna, si va a cambiar la clave) admita los cálculos de enclave (cifrados con claves maestras de columna habilitadas para el enclave).When using Always Encrypted with secure enclaves, you can change any encryption setting, if the column encryption key protecting the column (and the new column encryption key, if you're changing the key) support enclave computations (encrypted with enclave-enabled column master keys). Para más información, vea Always Encrypted con enclaves seguros.For details, see Always Encrypted with secure enclaves.

column_namecolumn_name
El nombre de la columna que se va a modificar, agregar o quitar.The name of the column to be altered, added, or dropped. La longitud máxima de column_name es 128 caracteres.The column_name maximum is 128 characters. Si se trata de columnas nuevas, puede omitir column_name para las columnas creadas con un tipo de datos timestamp.For new columns, you can omit column_name for columns created with a timestamp data type. Si no se especifica el argumento column_name en una columna con un tipo de datos timestamp, se usa el nombre timestamp.The name timestamp is used if you don't specify column_name for a timestamp data type column.

[ type_schema_name .[ type_schema_name. ] type_name] type_name
El nuevo tipo de datos de la columna modificada o el tipo de datos de la columna agregada.The new data type for the altered column, or the data type for the added column. No puede especificar type_name para columnas existentes de tablas con particiones.You can't specify type_name for existing columns of partitioned tables. type_name puede ser cualquiera de los siguientes tipos:type_name can be any one of the following types:

  • Un tipo de datos del sistema de SQL ServerSQL Server.A SQL ServerSQL Server system data type.
  • Un tipo de datos del alias basado en el tipo de datos del sistema de SQL ServerSQL Server.An alias data type based on a SQL ServerSQL Server system data type. Los tipos de datos de alias se crean con la instrucción CREATE TYPE antes de que puedan utilizarse en una definición de tabla.You create alias data types with the CREATE TYPE statement before they can be used in a table definition.
  • Un tipo definido por el usuario de .NET Framework.NET Framework y el esquema al que pertenece.A .NET Framework.NET Framework user-defined type, and the schema to which it belongs. Los tipos definidos por el usuario se crean con la instrucción CREATE TYPE antes de que puedan utilizarse en una definición de tabla.You create user-defined types with the CREATE TYPE statement before they can be used in a table definition.

A continuación se indican los criterios de type_name en una columna modificada:The following are criteria for type_name of an altered column:

  • El tipo de datos anterior debe poderse convertir implícitamente al nuevo tipo de datos.The previous data type must be implicitly convertible to the new data type.
  • type_name no puede ser timestamp.type_name can't be timestamp.
  • Los valores predeterminados de ANSI_NULL están siempre activados para ALTER COLUMN; si no se especifican, la columna admite valores NULL.ANSI_NULL defaults are always on for ALTER COLUMN; if not specified, the column is nullable.
  • El relleno ANSI_PADDING está siempre activado para ALTER COLUMN.ANSI_PADDING padding is always ON for ALTER COLUMN.
  • Si la columna alterada es una columna de identidad, new_data_type debe ser de un tipo de datos compatible con la propiedad de la identidad.If the modified column is an identity column, new_data_type must be a data type that supports the identity property.
  • La configuración actual de SET ARITHABORT se ignora.The current setting for SET ARITHABORT is ignored. ALTER TABLE opera como si la opción ARITHABORT estuviera activada.ALTER TABLE operates as if ARITHABORT is set to ON.

Nota

Si no se especifica la cláusula COLLATE, la modificación de un tipo de datos de columna tiene como resultado un cambio de intercalación a la intercalación predeterminada de la base de datos.If the COLLATE clause isn't specified, changing the data type of a column causes a collation change to the default collation of the database.

precisiónprecision
La precisión del tipo de datos especificado.The precision for the specified data type. Para más información sobre los valores de precisión válidos, vea Precisión, escala y longitud.For more information about valid precision values, see Precision, Scale, and Length.

escalascale
La escala del tipo de datos especificado.The scale for the specified data type. Para más información sobre los valores de escala válidos, vea Precisión, escala y longitud.For more information about valid scale values, see Precision, Scale, and Length.

maxmax
Solo se aplica a los tipos de datos varchar, nvarchar y varbinary para el almacenamiento de 2^31-1 bytes de caracteres, datos binarios y datos Unicode.Applies only to the varchar, nvarchar, and varbinary data types for storing 2^31-1 bytes of character, binary data, and of Unicode data.

xml_schema_collectionxml_schema_collection
Se aplica a: SQL ServerSQL Server (desde SQL Server 2008SQL Server 2008 hasta SQL Server 2017SQL Server 2017) y Base de datos SQL de AzureAzure SQL Database.Applies to: SQL ServerSQL Server ( SQL Server 2008SQL Server 2008 through SQL Server 2017SQL Server 2017) and Base de datos SQL de AzureAzure SQL Database.

Solo se aplica al tipo de datos xml para asociar un esquema XML con el tipo.Applies only to the xml data type for associating an XML schema with the type. Antes de escribir una columna xml en una colección de esquemas, cree primero la colección de esquema en la base de datos mediante el uso de CREATE XML SCHEMA COLLECTION.Before typing an xml column to a schema collection, you first create the schema collection in the database by using CREATE XML SCHEMA COLLECTION.

COLLATE < nombre_de_intercalación >COLLATE < collation_name >
Especifica la nueva intercalación de la columna alterada.Specifies the new collation for the altered column. Si no se especifica, se asigna a la columna la intercalación predeterminada de la base de datos.If not specified, the column is assigned the default collation of the database. El nombre de intercalación puede ser un nombre de intercalación de Windows o un nombre de intercalación de SQL.Collation name can be either a Windows collation name or a SQL collation name. Para obtener una lista y más información, vea Windows Collation Name [Nombre de intercalación de Windows (Transact-SQL)] y SQL Server Collation Name [Nombre de intercalación de SQL Server (Transact-SQL)].For a list and more information, see Windows Collation Name and SQL Server Collation Name.

La cláusula COLLATE cambia únicamente las intercalaciones de las columnas con tipos de datos char, varchar, nchar y nvarchar.The COLLATE clause changes the collations only of columns of the char, varchar, nchar, and nvarchar data types. Para cambiar la intercalación de una columna de tipo de datos de alias definido por el usuario, use distintas instrucciones ALTER TABLE para cambiar la columna a un tipo de datos del sistema SQL ServerSQL Server.To change the collation of a user-defined alias data type column, use separate ALTER TABLE statements to change the column to a SQL ServerSQL Server system data type. A continuación, cambie su intercalación y cambie la columna de nuevo a un tipo de datos de alias.Then, change its collation and change the column back to an alias data type.

ALTER COLUMN no puede tener un cambio de intercalación si existe alguna de las siguientes condiciones:ALTER COLUMN can't have a collation change if one or more of the following conditions exist:

  • Si una restricción CHECK, una restricción FOREIGN KEY o las columnas calculadas hacen referencia a la columna cambiada.If a CHECK constraint, FOREIGN KEY constraint, or computed columns reference the column changed.
  • Si se ha creado algún índice, estadística o índice de texto completo en la columna.If any index, statistics, or full-text index are created on the column. Las estadísticas creadas automáticamente en la columna cambiada se quitarán si se altera la intercalación de columna.Statistics created automatically on the column changed are dropped if the column collation is changed.
  • Si una función o vista enlazada a esquema hace referencia a la columna.If a schema-bound view or function references the column.

Para obtener más información, vea COLLATE.For more information, see COLLATE.

NULL | NOT NULLNULL | NOT NULL
Especifica si la columna puede aceptar valores NULL.Specifies whether the column can accept null values. Las columnas que no permiten valores NULL solo se pueden agregar con ALTER TABLE si tienen especificado un valor predeterminado o si la tabla está vacía.Columns that don't allow null values are added with ALTER TABLE only if they have a default specified or if the table is empty. Puede especificar NOT NULL para columnas calculadas solo si también especificó PERSISTED.You can specify NOT NULL for computed columns only if you've also specified PERSISTED. Si la nueva columna permite valores NULL y no se especifica un valor predeterminado, la nueva columna contendrá un valor NULL en cada fila de la tabla.If the new column allows null values and you don't specify a default, the new column contains a null value for each row in the table. Si la nueva columna permite valores NULL y agrega una definición predeterminada con la nueva columna, se puede utilizar la opción WITH VALUES para almacenar el valor predeterminado en la nueva columna para cada fila existente en la tabla.If the new column allows null values and you add a default definition with the new column, you can use WITH VALUES to store the default value in the new column for each existing row in the table.

Si la nueva columna no permite valores NULL y la tabla no está vacía, debe agregar una definición DEFAULT con la nueva columna.If the new column doesn't allow null values and the table isn't empty, you have to add a DEFAULT definition with the new column. Y la columna nueva se carga automáticamente con el valor predeterminado en cada fila existente de las columnas nuevas.And, the new column automatically loads with the default value in the new columns in each existing row.

Puede especificar NULL en ALTER COLUMN para forzar que una columna NOT NULL permita valores NULL, excepto en el caso de las columnas de las restricciones PRIMARY KEY.You can specify NULL in ALTER COLUMN to force a NOT NULL column to allow null values, except for columns in PRIMARY KEY constraints. Puede especificar NOT NULL en ALTER COLUMN solo si la columna no contiene valores NULL.You can specify NOT NULL in ALTER COLUMN only if the column contains no null values. Los valores NULL deben actualizarse a algún valor para poder permitir ALTER COLUMN NOT NULL, como:The null values must be updated to some value before the ALTER COLUMN NOT NULL is allowed, for example:

UPDATE MyTable SET NullCol = N'some_value' WHERE NullCol IS NULL;
ALTER TABLE MyTable ALTER COLUMN NullCOl NVARCHAR(20) NOT NULL;

Cuando cree o altere una tabla con las instrucciones CREATE TABLE o ALTER TABLE, los valores de sesión y de la base de datos influirán en la nulabilidad, y posiblemente la invalidarán, para el tipo de datos utilizado en la definición de una columna.When you create or alter a table with the CREATE TABLE or ALTER TABLE statements, the database and session settings influence and possibly override the nullability of the data type that's used in a column definition. Asegúrese de definir siempre explícitamente una columna como NULL o como NOT NULL en el caso de las columnas no calculadas.Be sure that you always explicitly define a column as NULL or NOT NULL for noncomputed columns.

Si agrega una columna con un tipo de datos definidos por el usuario, asegúrese de definir la columna con la misma nulabilidad del tipo de datos definidos por el usuario.If you add a column with a user-defined data type, be sure to define the column with the same nullability as the user-defined data type. Y especifique un valor predeterminado para la columna.And, specify a default value for the column. Para obtener más información, vea CREATE TABLE.For more information, see CREATE TABLE.

Nota

Si se especifica NULL o NOT NULL con ALTER COLUMN, también se debe especificar new_data_type [(precision [, scale ])].If NULL or NOT NULL is specified with ALTER COLUMN, new_data_type [(precision [, scale ])] must also be specified. Si el tipo de datos, la precisión y la escala no se cambian, especifique los valores actuales de la columna.If the data type, precision, and scale are not changed, specify the current column values.

[ {ADD | DROP} ROWGUIDCOL ][ {ADD | DROP} ROWGUIDCOL ]
Se aplica a: SQL ServerSQL Server (desde SQL Server 2008SQL Server 2008 hasta SQL Server 2017SQL Server 2017) y Base de datos SQL de AzureAzure SQL Database.Applies to: SQL ServerSQL Server ( SQL Server 2008SQL Server 2008 through SQL Server 2017SQL Server 2017) and Base de datos SQL de AzureAzure SQL Database.

Especifica que la propiedad ROWGUIDCOL se agrega a la columna indicada o se quita de ella.Specifies that the ROWGUIDCOL property is added to or dropped from the specified column. ROWGUIDCOL indica que la columna es una columna GUID de fila.ROWGUIDCOL indicates that the column is a row GUID column. Puede designar solo una columna uniqueidentifier por tabla como columna ROWGUIDCOL.You can set only one uniqueidentifier column per table as the ROWGUIDCOL column. Y solo puede asignar la propiedad ROWGUIDCOL a una columna uniqueidentifier.And, you can only assign the ROWGUIDCOL property to a uniqueidentifier column. ROWGUIDCOL no puede asignarse a una columna de un tipo de datos definido por el usuario.You can't assign ROWGUIDCOL to a column of a user-defined data type.

ROWGUIDCOL no exige la exclusividad de los valores almacenados en la columna y no genera automáticamente valores para las nuevas filas que se insertan en la tabla.ROWGUIDCOL doesn't enforce uniqueness of the values stored in the column and doesn't automatically generate values for new rows that are inserted into the table. Si desea generar valores únicos para cada columna, use la función NEWID o NEWSEQUENTIALID en instrucciones INSERT.To generate unique values for each column, either use the NEWID or NEWSEQUENTIALID function on INSERT statements. O bien, especifique la función NEWID o NEWSEQUENTIALID como valor predeterminado para la columna.Or, specify the NEWID or NEWSEQUENTIALID function as the default for the column.

[ {ADD | DROP} PERSISTED ][ {ADD | DROP} PERSISTED ]
Especifica que la propiedad PERSISTED se agrega a la columna indicada o se quita de ella.Specifies that the PERSISTED property is added to or dropped from the specified column. La columna debe ser una columna calculada definida mediante una expresión determinista.The column must be a computed column that's defined with a deterministic expression. Para las columnas especificadas como PERSISTED, Motor de base de datosDatabase Engine almacena físicamente los valores calculados en la tabla y actualiza los valores cuando se actualiza cualquiera de las otras columnas de las que depende la columna calculada.For columns specified as PERSISTED, the Motor de base de datosDatabase Engine physically stores the computed values in the table and updates the values when any other columns on which the computed column depends are updated. Al marcar una columna calculada como PERSISTED, puede crear índices sobre columnas calculadas definidas sobre expresiones que son deterministas, pero no precisas.By marking a computed column as PERSISTED, you can create indexes on computed columns defined on expressions that are deterministic, but not precise. Para obtener más información, vea Indexes on Computed Columns.For more information, see Indexes on Computed Columns.

Las columnas calculadas que se utilizan como columna de partición de una tabla con particiones deben marcarse explícitamente como PERSISTED.Any computed column that's used as a partitioning column of a partitioned table must be explicitly marked PERSISTED.

DROP NOT FOR REPLICATIONDROP NOT FOR REPLICATION
Se aplica a: SQL ServerSQL Server (desde SQL Server 2008SQL Server 2008 hasta SQL Server 2017SQL Server 2017) y Base de datos SQL de AzureAzure SQL Database.Applies to: SQL ServerSQL Server ( SQL Server 2008SQL Server 2008 through SQL Server 2017SQL Server 2017) and Base de datos SQL de AzureAzure SQL Database.

Especifica que los valores de columnas de identidad se incrementan cuando los agentes de replicación realizan operaciones de inserción.Specifies that values are incremented in identity columns when replication agents carry out insert operations. Solo puede especificar esta cláusula si column_name es una columna de identidad.You can specify this clause only if column_name is an identity column.

SPARSESPARSE
Indica que la columna es una columna dispersa.Indicates that the column is a sparse column. El almacenamiento de columnas dispersas está optimizado para los valores NULL.The storage of sparse columns is optimized for null values. No se puede establecer las columnas dispersas como NOT NULL.You can't set sparse columns as NOT NULL. Al convertir una columna de dispersa a no dispersa o viceversa, se bloquea la tabla durante la ejecución del comando.Converting a column from sparse to nonsparse or from nonsparse to sparse, locks the table for the duration of the command execution. Es posible que tenga que usar la cláusula REBUILD para recuperar espacio.You may need to use the REBUILD clause to reclaim any space savings. Para conocer otras restricciones y leer más información sobre columnas dispersas, vea Usar columnas dispersas.For additional restrictions and more information about sparse columns, see Use Sparse Columns.

ADD MASKED WITH ( FUNCTION = ' mask_function ')ADD MASKED WITH ( FUNCTION = ' mask_function ')
Se aplica a: SQL ServerSQL Server (desde SQL Server 2016 (13.x)SQL Server 2016 (13.x) hasta SQL Server 2017SQL Server 2017) y Base de datos SQL de AzureAzure SQL Database.Applies to: SQL ServerSQL Server ( SQL Server 2016 (13.x)SQL Server 2016 (13.x) through SQL Server 2017SQL Server 2017) and Base de datos SQL de AzureAzure SQL Database.

Especifica una máscara dinámica de datos.Specifies a dynamic data mask. mask_function es el nombre de la función de máscara con los parámetros adecuados.mask_function is the name of the masking function with the appropriate parameters. Hay tres funciones disponibles:Three functions are available:

  • default()default()
  • email()email()
  • partial()partial()
  • random()random()

Para quitar una máscara, utilice DROP MASKED.To drop a mask, use DROP MASKED. Para conocer más parámetros de función, vea Enmascaramiento de datos dinámicos.For function parameters, see Dynamic Data Masking.

WITH ( ONLINE = ON | OFF) <tal como se aplica al modificar una columna>WITH ( ONLINE = ON | OFF) <as applies to altering a column>
Se aplica a: SQL ServerSQL Server (desde SQL Server 2016 (13.x)SQL Server 2016 (13.x) hasta SQL Server 2017SQL Server 2017) y Base de datos SQL de AzureAzure SQL Database.Applies to: SQL ServerSQL Server ( SQL Server 2016 (13.x)SQL Server 2016 (13.x) through SQL Server 2017SQL Server 2017) and Base de datos SQL de AzureAzure SQL Database.

Permite realizar numerosas acciones de alteración de columna mientras la tabla sigue estando disponible.Allows many alter column actions to be carried out while the table remains available. El valor predeterminado es OFF.Default is OFF. La alteración de columna se puede realizar en línea para los cambios de columna relacionados con el tipo de datos, la precisión o la longitud de la columna, la nulabilidad, la escasez y la intercalación.You can run alter column online for column changes related to data type, column length or precision, nullability, sparseness, and collation.

La alteración de columna en línea permite a las estadísticas automáticas y a las creadas por el usuario hacer referencia a la columna alterada durante la operación ALTER COLUMN, lo que requiere que las consultas se ejecuten del modo habitual.Online alter column allows user created and autostatistics to reference the altered column for the duration of the ALTER COLUMN operation, which allows queries to run as usual. Al final de la operación, se quitan las estadísticas automáticas que hacen referencia a la columna y se invalidan las estadísticas creadas por el usuario.At the end of the operation, autostats that reference the column are dropped and user-created stats are invalidated. El usuario debe actualizar manualmente las estadísticas generadas por el usuario una vez completada la operación.The user must manually update user-generated statistics after the operation is completed. Si la columna forma parte de una expresión de filtro para estadísticas o índices, no podrá realizar una operación para alterar la columna.If the column is part of a filter expression for any statistics or indexes then you can't perform an alter column operation.

  • Mientras se ejecuta la operación de alteración en línea de columna, todas las operaciones que podrían tomar una dependencia en la columna (índices, vistas, etc.) se bloquearán o devolverán el error correspondiente.While the online alter column operation is running, all operations that could take a dependency on the column (index, views, and so on.) block or fail with an appropriate error. Este comportamiento garantiza que no se produzcan problemas en la alteración de columna en línea debido a las dependencias introducidas durante la ejecución de la operación.This behavior guarantees that online alter column won't fail because of dependencies introduced while the operation was running.
  • No se admite la alteración de columnas NOT NULL a NULL como una operación en línea cuando los índices no agrupados en clúster hacen referencia a la columna alterada.Altering a column from NOT NULL to NULL isn't supported as an online operation when the altered column is referenced by nonclustered indexes.
  • No se admite la alteración en línea cuando una restricción CHECK hace referencia a la columna y la operación de alteración limita la precisión de esta (numéricos o fecha y hora).Online alter isn't supported when the column is referenced by a check constraint and the alter operation is restricting the precision of the column (numeric or datetime).
  • La opción WAIT_AT_LOW_PRIORITY no puede utilizarse con alteración de columna en línea.The WAIT_AT_LOW_PRIORITY option can't be used with online alter column.
  • ALTER COLUMN ... ADD/DROP PERSISTED no se admite para la alteración de columna en línea.ALTER COLUMN ... ADD/DROP PERSISTED isn't supported for online alter column.
  • ALTER COLUMN ... ADD/DROP ROWGUIDCOL/NOT FOR REPLICATION no se ve afectado por la alteración de columna en línea.ALTER COLUMN ... ADD/DROP ROWGUIDCOL/NOT FOR REPLICATION isn't affected by online alter column.
  • La alteración de columna en línea no admite la modificación de una tabla con el seguimiento de cambios habilitado que sea un publicador de replicación de mezcla.Online alter column doesn't support altering a table where change tracking is enabled or that's a publisher of merge replication.
  • La alteración de columna en línea no admite la alteración desde tipos de datos CLR o a estos.Online alter column doesn't support altering from or to CLR data types.
  • La alteración de columna en línea no admite la alteración a un tipo de datos XML con una colección de esquemas diferente a la colección de esquemas actual.Online alter column doesn't support altering to an XML data type that has a schema collection different than the current schema collection.
  • La alteración de columna en línea no reduce las restricciones sobre cuándo se puede modificar una columna.Online alter column doesn't reduce the restrictions on when a column can be altered. Las referencias de las estadísticas/índice, etc. podrían provocar el error de la alteración.References by index/stats, and so on, might cause the alter to fail.
  • La alteración de columna en línea no admite la modificación de más de una columna simultáneamente.Online alter column doesn't support altering more than one column concurrently.
  • La alteración de columna en línea no tiene ningún efecto en caso de tablas temporales con versiones del sistema.Online alter column has no effect in a system-versioned temporal table. La columna ALTER no se ejecuta en línea, independientemente del valor que se especificó para la opción ONLINE.ALTER column isn't run as online regardless of which value was specified for ONLINE option.

La alteración de columna en línea tiene requisitos, restricciones y funciones similares a los de la regeneración de índice en línea, lo cual incluye lo siguiente:Online alter column has similar requirements, restrictions, and functionality as online index rebuild, which includes:

  • No se admite la regeneración de índices en línea cuando la tabla contiene columnas LOB o filestream heredadas, o cuando tiene un índice de almacén de columnas.Online index rebuild isn't supported when the table contains legacy LOB or filestream columns or when the table has a columnstore index. Las mismas limitaciones se aplican para las alteraciones de columna en línea.The same limitations apply for online alter column.
  • Una columna existente que se va a modificar requiere dos veces la misma asignación de espacio; para la columna original y para la columna oculta recién creada.An existing column being altered requires twice the space allocation, for the original column and for the newly created hidden column.
  • La estrategia de bloqueo durante una operación de alteración de columna en línea sigue el mismo patrón de bloqueo usado para la generación de índice en línea.The locking strategy during an alter column online operation follows the same locking pattern used for online index build.

WITH CHECK | WITH NOCHECKWITH CHECK | WITH NOCHECK
Especifica si los datos de la tabla se han validado o no frente a una restricción FOREIGN KEY o CHECK recién agregada o habilitada de nuevo.Specifies whether the data in the table is or isn't validated against a newly added or re-enabled FOREIGN KEY or CHECK constraint. Si no se especifica, se supone WITH CHECK para las restricciones nuevas y WITH NOCHECK para las restricciones que se han habilitado otra vez.If you don't specify, WITH CHECK is assumed for new constraints, and WITH NOCHECK is assumed for re-enabled constraints.

Si no desea volver a comprobar las restricciones CHECK o FOREIGN KEY nuevas con los datos existentes, utilice WITH NOCHECK.If you don't want to verify new CHECK or FOREIGN KEY constraints against existing data, use WITH NOCHECK. No se recomienda que haga esto, excepto en casos muy contados.We don't recommend doing this, except in rare cases. La nueva restricción se evalúa en todas las actualizaciones futuras.The new constraint is evaluated in all later data updates. Las infracciones de restricción que se supriman mediante WITH NOCHECK cuando se agrega la restricción pueden hacer que las actualizaciones futuras no se puedan llevar a cabo si actualizan filas con datos que no cumplan la restricción.Any constraint violations that are suppressed by WITH NOCHECK when the constraint is added may cause future updates to fail if they update rows with data that doesn't follow the constraint.

Nota

El optimizador de consultas no considera las restricciones definidas como WITH NOCHECK.The query optimizer doesn't consider constraints that are defined WITH NOCHECK. Estas restricciones se pasan por alto hasta que se vuelven a habilitar mediante ALTER TABLE table WITH CHECK CHECK CONSTRAINT ALL.Such constraints are ignored until they are re-enabled by using ALTER TABLE table WITH CHECK CHECK CONSTRAINT ALL.

ALTER INDEX nombre_de_índiceALTER INDEX index_name
Especifica que es necesario cambiar o modificar el número de cubos de nombre_de_índice.Specifies that the bucket count for index_name is to be changed or altered.

La sintaxis ALTER TABLE ... ADD/DROP/ALTER INDEX solo se admite para tablas optimizadas para memoria.The syntax ALTER TABLE ... ADD/DROP/ALTER INDEX is supported only for memory-optimized tables.

Importante

Si no se usa una instrucción ALTER TABLE, las instrucciones CREATE INDEX, DROP INDEX, ALTER INDEX y PAD_INDEX no son compatibles con los índices de las tablas optimizadas para memoria.Without using an ALTER TABLE statement, the statements CREATE INDEX, DROP INDEX, ALTER INDEX, and PAD_INDEX are not supported for indexes on memory-optimized tables.

ADDADD
Especifica que se agregan una o más definiciones de columna, definiciones de columnas calculadas o restricciones de tabla.Specifies that one or more column definitions, computed column definitions, or table constraints are added. O bien, se agregan las columnas que el sistema usa para el control de versiones del sistema.Or, the columns that the system uses for system versioning are added. Puede agregar un índice para las tablas optimizadas para memoria.For memory-optimized tables, you can add an index.

Importante

Si no se usa una instrucción ALTER TABLE, las instrucciones CREATE INDEX, DROP INDEX, ALTER INDEX y PAD_INDEX no son compatibles con los índices de las tablas optimizadas para memoria.Without using an ALTER TABLE statement, the statements CREATE INDEX, DROP INDEX, ALTER INDEX, and PAD_INDEX aren't supported for indexes on memory-optimized tables.

PERIOD FOR SYSTEM_TIME ( system_start_time_column_name, system_end_time_column_name )PERIOD FOR SYSTEM_TIME ( system_start_time_column_name, system_end_time_column_name )
Se aplica a: SQL ServerSQL Server (de SQL Server 2017 (14.x)SQL Server 2017 (14.x) a SQL Server 2017SQL Server 2017) y a Base de datos SQL de AzureAzure SQL Database.Applies to: SQL ServerSQL Server (SQL Server 2017 (14.x)SQL Server 2017 (14.x) through SQL Server 2017SQL Server 2017) and Base de datos SQL de AzureAzure SQL Database.

Especifica los nombres de las columnas que el sistema usa para registrar el período durante el que un registro es válido.Specifies the names of the columns that the system uses to record the period of time for which a record is valid. Puede especificar las columnas existentes o crear nuevas columnas como parte del argumento ADD PERIOD FOR SYSTEM_TIME.You can specify existing columns or create new columns as part of the ADD PERIOD FOR SYSTEM_TIME argument. Configure las columnas con el tipo de datos de datetime2 y defínalas como NOT NULL.Set up the columns with the datatype of datetime2 and define them as NOT NULL. Si una columna de período se define como NULL, se producirá un error.If you define a period column as NULL, an error results. Puede definir column_constraint o especificar valores predeterminados para las columnas en las columnas system_start_time y system_end_time.You can define a column_constraint and/or Specify Default Values for Columns for the system_start_time and system_end_time columns. Vea el ejemplo A en la sección Control de versiones del sistema, en que se muestra el uso de un valor predeterminado para la columna system_end_time.See Example A in the following System Versioning examples that demonstrates using a default value for the system_end_time column.

Utilice este argumento con el argumento SET SYSTEM_VERSIONING para habilitar el control de versiones del sistema en una tabla existente.Use this argument with the SET SYSTEM_VERSIONING argument to enable system versioning on an existing table. Para obtener más información, consulte Tablas temporales e Introducción a las tablas temporales de Base de datos SQL de Azure.For more information, see Temporal Tables and Getting Started with Temporal Tables in Azure SQL Database.

A partir de SQL Server 2017 (14.x)SQL Server 2017 (14.x), los usuarios pueden marcar una o ambas columnas de período con la marca HIDDEN para ocultarlas implícitamente, de modo que SELECT * FROM <nombre_de_tabla> no devuelva ningún valor para esas columnas.As of SQL Server 2017 (14.x)SQL Server 2017 (14.x), users can mark one or both period columns with HIDDEN flag to implicitly hide these columns such that SELECT * FROM <table_name> doesn't return a value for the columns. De forma predeterminada, no se ocultan las columnas de período.By default, period columns aren't hidden. Para poder usar las columnas ocultas, deben incluirse explícitamente en todas las consultas que hacen referencia directa a la tabla temporal.In order to be used, hidden columns must be explicitly included in all queries that directly reference the temporal table.

DROPDROP
Especifica que se quitan una o más definiciones de columna, definiciones de columnas calculadas o restricciones de tabla, o que se quita la especificación para las columnas que el sistema utiliza para el control de versiones del sistema.Specifies that one or more column definitions, computed column definitions, or table constraints are dropped, or to drop the specification for the columns that the system uses for system versioning.

CONSTRAINT constraint_nameCONSTRAINT constraint_name
Especifica que constraint_name se ha quitado de la tabla.Specifies that constraint_name is removed from the table. Se pueden enumerar múltiples restricciones.Multiple constraints can be listed.

Puede determinar el nombre de la restricción, ya sea proporcionado por el sistema o definido por el usuario, mediante la consulta de las vistas de catálogo sys.check_constraint, sys.default_constraints, sys.key_constraints y sys.foreign_keys.You can determine the user-defined or system-supplied name of the constraint by querying the sys.check_constraint, sys.default_constraints, sys.key_constraints, and sys.foreign_keys catalog views.

Una restricción PRIMARY KEY no puede quitarse si existe un índice XML en la tabla.A PRIMARY KEY constraint can't be dropped if an XML index exists on the table.

INDEX nombre_de_índiceINDEX index_name
Especifica que nombre_de_índice se ha quitado de la tabla.Specifies that index_name is removed from the table.

La sintaxis ALTER TABLE ... ADD/DROP/ALTER INDEX solo se admite para tablas optimizadas para memoria.The syntax ALTER TABLE ... ADD/DROP/ALTER INDEX is supported only for memory-optimized tables.

Importante

Si no se usa una instrucción ALTER TABLE, las instrucciones CREATE INDEX, DROP INDEX, ALTER INDEX y PAD_INDEX no son compatibles con los índices de las tablas optimizadas para memoria.Without using an ALTER TABLE statement, the statements CREATE INDEX, DROP INDEX, ALTER INDEX, and PAD_INDEX are not supported for indexes on memory-optimized tables.

COLUMN column_nameCOLUMN column_name
Especifica que constraint_name o column_name se quita de la tabla.Specifies that constraint_name or column_name is removed from the table. Pueden especificarse varias columnas.Multiple columns can be listed.

Una columna no puede quitarse cuando:A column can't be dropped when it's:

  • Se usa en un índice, ya sea como una columna de clave o como una cláusula INCLUDEUsed in an index, whether as a key column or as an INCLUDE
  • Se utiliza en una restricción CHECK, FOREIGN KEY, UNIQUE o PRIMARY KEY.Used in a CHECK, FOREIGN KEY, UNIQUE, or PRIMARY KEY constraint.
  • Está asociada con un valor predeterminado definido con la palabra clave DEFAULT o enlazada a un objeto predeterminado.Associated with a default that's defined with the DEFAULT keyword, or bound to a default object.
  • Está enlazada a una regla.Bound to a rule.

Nota

Quitar una columna no recupera el espacio en disco de la columna.Dropping a column doesn't reclaim the disk space of the column. Tendrá que recuperar el espacio en disco de una columna quitada cuando el tamaño de fila de una tabla esté a punto de superar su límite o lo haya hecho ya.You may have to reclaim the disk space of a dropped column when the row size of a table is near, or has exceeded, its limit. Recupere el espacio mediante la creación de un índice agrupado en la tabla o regenerando un índice agrupado existente mediante la utilización de ALTER INDEX.Reclaim space by creating a clustered index on the table or rebuilding an existing clustered index by using ALTER INDEX. Para obtener más información acerca del impacto de quitar los tipos de datos LOB, vea esta entrada del blog de CSS.For information about the impact of dropping LOB data types, see this CSS blog entry.

PERIOD FOR SYSTEM_TIMEPERIOD FOR SYSTEM_TIME
Se aplica a: SQL ServerSQL Server (desde SQL Server 2016 (13.x)SQL Server 2016 (13.x) hasta SQL Server 2017SQL Server 2017) y Base de datos SQL de AzureAzure SQL Database.Applies to: SQL ServerSQL Server ( SQL Server 2016 (13.x)SQL Server 2016 (13.x) through SQL Server 2017SQL Server 2017) and Base de datos SQL de AzureAzure SQL Database.

Quita la especificación de las columnas que va a utilizar el sistema para el control de versiones del sistema.Drops the specification for the columns that the system will use for system versioning.

WITH <drop_clustered_constraint_option>WITH <drop_clustered_constraint_option>
Especifica que se han establecido una o más opciones para quitar restricciones en clúster.Specifies that one or more drop clustered constraint options are set.

MAXDOP = max_degree_of_parallelismMAXDOP = max_degree_of_parallelism
Se aplica a: SQL ServerSQL Server (desde SQL Server 2008SQL Server 2008 hasta SQL Server 2017SQL Server 2017) y Base de datos SQL de AzureAzure SQL Database.Applies to: SQL ServerSQL Server ( SQL Server 2008SQL Server 2008 through SQL Server 2017SQL Server 2017) and Base de datos SQL de AzureAzure SQL Database.

Invalida la opción de configuración grado máximo de paralelismo solo durante la operación.Overrides the max degree of parallelism configuration option only for the duration of the operation. Para obtener más información, vea Establecer la opción de configuración del servidor Grado máximo de paralelismo.For more information, see Configure the max degree of parallelism Server Configuration Option.

Utilice la opción MAXDOP para limitar el número de procesadores utilizados en la ejecución de planes paralelos.Use the MAXDOP option to limit the number of processors used in parallel plan execution. El máximo es 64 procesadores.The maximum is 64 processors.

max_degree_of_parallelism puede ser uno de los siguientes valores:max_degree_of_parallelism can be one of the following values:

11
Suprime la generación de planes paralelos.Suppresses parallel plan generation.

>1>1
Restringe el número máximo de procesadores utilizados en una operación de índice paralelo para el número especificado.Restricts the maximum number of processors used in a parallel index operation to the specified number.

0 (predeterminado)0 (default)
Usa el número real de procesadores o menos, según la carga de trabajo actual del sistema.Uses the actual number of processors or fewer based on the current system workload.

Para obtener más información, vea Configurar operaciones de índice en paralelo.For more information, see Configure Parallel Index Operations.

Nota

Las operaciones de índices en paralelo no están disponibles en todas las ediciones de SQL ServerSQL Server.Parallel index operations aren't available in every edition of SQL ServerSQL Server. Para obtener más información, vea Ediciones y características admitidas de SQL Server 2016 y Ediciones y características admitidas de SQL Server 2017.For more information, see Editions and Supported Features for SQL Server 2016, and Editions and Supported Features for SQL Server 2017.

ONLINE = { ON | OFF } <tal como se aplica a drop_clustered_constraint_option>ONLINE = { ON | OFF } <as applies to drop_clustered_constraint_option>
Especifica si las tablas subyacentes y los índices asociados están disponibles para realizar consultas y modificar datos durante la operación de índice.Specifies whether underlying tables and associated indexes are available for queries and data modification during the index operation. El valor predeterminado es OFF.The default is OFF. Puede ejecutar REBUILD como una operación ONLINE.You can run REBUILD as an ONLINE operation.

ONON
Los bloqueos de tabla de larga duración no se mantienen durante la operación de indización.Long-term table locks aren't held for the duration of the index operation. Durante la fase principal de la operación de índice, solo se mantiene un bloqueo preventivo en la tabla de origen.During the main phase of the index operation, only an Intent Share (IS) lock is held on the source table. De esta forma, las consultas o actualizaciones realizadas sobre la tabla y los índices subyacentes pueden continuar.This behavior enables queries or updates to the underlying table and indexes to continue. Al principio de la operación, se mantiene un bloqueo compartido (S) sobre el objeto de origen durante un breve espacio de tiempo.At the start of the operation, a Shared (S) lock is held on the source object for a short time. Al final de la operación, durante un breve período, se adquiere un bloqueo S (compartido) en el origen si se está creando un índice no agrupado.At the end of the operation, for a short time, an S (Shared) lock is acquired on the source if a nonclustered index is being created. O bien, se adquiere un bloqueo SCH-M (modificación del esquema) cuando se crea o se pone en línea un índice agrupado y cuando se vuelve a compilar un índice agrupado o no.Or, an SCH-M (Schema Modification) lock is acquired when a clustered index is created or dropped online and when a clustered or nonclustered index is being rebuilt. ONLINE no se puede establecer en ON cuando se crea un índice en una tabla temporal local.ONLINE can't be set to ON when an index is being created on a local temporary table. Solo se permite la operación de regeneración de montón de un único subproceso.Only single-threaded heap rebuild operation is allowed.

Para ejecutar DDL para SWITCH o para regenerar el índice en línea, todas las transacciones activas de bloqueo que se ejecutan en una tabla determinada deben completarse.To run the DDL for SWITCH or online index rebuild, all active blocking transactions running on a particular table must be completed. Cuando se ejecuta, SWITCH o la operación de regeneración impide que la nueva transacción se inicie y podría afectar significativamente al rendimiento de la carga de trabajo y retrasar temporalmente el acceso a la tabla base.When executing, the SWITCH or rebuild operation prevents new transactions from starting and might significantly affect the workload throughput and temporarily delay access to the underlying table.

OFFOFF
Los bloqueos de tabla se aplican durante la operación de índice.Table locks apply for the duration of the index operation. Una operación de índice sin conexión para crear, volver a crear o quitar un índice clúster, o para volver a crear o quitar un índice no clúster, adquiere un bloqueo de modificación del esquema (Sch-M) de la tabla.An offline index operation that creates, rebuilds, or drops a clustered index, or rebuilds or drops a nonclustered index, acquires a Schema modification (Sch-M) lock on the table. Este bloqueo evita que todos los usuarios tengan acceso a la tabla subyacente durante la operación.This lock prevents all user access to the underlying table for the duration of the operation. Una operación de índice sin conexión que crea un índice no clúster adquiere un bloqueo compartido (S) en la tabla.An offline index operation that creates a nonclustered index acquires a Shared (S) lock on the table. Este bloqueo evita que se realicen actualizaciones en la tabla subyacente, pero permite la realización de operaciones de lectura, como instrucciones SELECT.This lock prevents updates to the underlying table but allows read operations, such as SELECT statements. Se permiten operaciones multiproceso de regeneración del montón.Multi-threaded heap rebuild operations are allowed.

Para más información, vea Cómo funcionan las operaciones de índice en línea.For more information, see How Online Index Operations Work.

Nota

Las operaciones de índices en línea no están disponibles en todas las ediciones de SQL ServerSQL Server.Online index operations are not available in every edition of SQL ServerSQL Server. Para obtener más información, vea Ediciones y características admitidas de SQL Server 2016 y Ediciones y características admitidas de SQL Server 2017.For more information, see Editions and Supported Features for SQL Server 2016, and Editions and Supported Features for SQL Server 2017.

MOVE TO { partition_scheme_name ( column_name [ 1 , ... n] ) | filegroup | " default " }MOVE TO { partition_scheme_name(column_name [ 1 , ... n] ) | filegroup | " default " }
Se aplica a: SQL ServerSQL Server (desde SQL Server 2008SQL Server 2008 hasta SQL Server 2017SQL Server 2017) y Base de datos SQL de AzureAzure SQL Database.Applies to: SQL ServerSQL Server ( SQL Server 2008SQL Server 2008 through SQL Server 2017SQL Server 2017) and Base de datos SQL de AzureAzure SQL Database.

Especifica una ubicación a la que mover las filas de datos que se encuentran en el nivel hoja del índice clúster.Specifies a location to move the data rows currently in the leaf level of the clustered index. La tabla se mueve a la nueva ubicación.The table is moved to the new location. Esta opción solo se aplica a las restricciones que crean un índice clúster.This option applies only to constraints that create a clustered index.

Nota

En este contexto, el valor predeterminado no es una palabra clave.In this context, default isn't a keyword. Es un identificador para el grupo de archivos predeterminado y debe delimitarse, como en MOVE TO " default " o MOVE TO [ default ] .It is an identifier for the default filegroup and must be delimited, as in MOVE TO " default " or MOVE TO [ default ]. Si se especifica " default " , la opción QUOTED_IDENTIFIER debe ser ON para la sesión actual.If " default " is specified, the QUOTED_IDENTIFIER option must be ON for the current session. Esta es la configuración predeterminada.This is the default setting. Para más información, consulte SET QUOTED_IDENTIFIER.For more information, see SET QUOTED_IDENTIFIER.

{ CHECK | NOCHECK } CONSTRAINT{ CHECK | NOCHECK } CONSTRAINT
Especifica si constraint_name está habilitado o deshabilitado.Specifies that constraint_name is enabled or disabled. Esta opción solo se puede utilizar con las restricciones FOREIGN KEY y CHECK.This option can only be used with FOREIGN KEY and CHECK constraints. Cuando se especifica NOCHECK, la restricción se deshabilita y las posteriores inserciones o actualizaciones de la columna no se validan con las condiciones de la restricción.When NOCHECK is specified, the constraint is disabled and future inserts or updates to the column are not validated against the constraint conditions. Las restricciones DEFAULT, PRIMARY KEY y UNIQUE no se pueden deshabilitar.DEFAULT, PRIMARY KEY, and UNIQUE constraints can't be disabled.

ALLALL
Especifica que todas las restricciones están deshabilitadas con la opción NOCHECK o habilitadas con la opción CHECK.Specifies that all constraints are either disabled with the NOCHECK option or enabled with the CHECK option.

{ ENABLE | DISABLE } TRIGGER{ ENABLE | DISABLE } TRIGGER
Especifica si trigger_name está habilitado o deshabilitado.Specifies that trigger_name is enabled or disabled. Cuando se deshabilita un desencadenador, sigue definido para la tabla.When a trigger is disabled, it's still defined for the table. Sin embargo, cuando las instrucciones INSERT, UPDATE o DELETE se ejecutan en la tabla, las acciones del desencadenador no se llevan a cabo hasta que se vuelva a habilitar.However, when INSERT, UPDATE, or DELETE statements run against the table, the actions in the trigger aren't carried out until the trigger is re-enabled.

ALLALL
Especifica si todos los desencadenadores de la tabla están habilitados o deshabilitados.Specifies that all triggers in the table are enabled or disabled.

trigger_nametrigger_name
Especifica el nombre del desencadenador que se va a habilitar o deshabilitar.Specifies the name of the trigger to disable or enable.

{ ENABLE | DISABLE } CHANGE_TRACKING{ ENABLE | DISABLE } CHANGE_TRACKING
Se aplica a: SQL ServerSQL Server (desde SQL Server 2008SQL Server 2008 hasta SQL Server 2017SQL Server 2017) y Base de datos SQL de AzureAzure SQL Database.Applies to: SQL ServerSQL Server ( SQL Server 2008SQL Server 2008 through SQL Server 2017SQL Server 2017) and Base de datos SQL de AzureAzure SQL Database.

Especifica si el seguimiento de cambios está habilitado o deshabilitado para la tabla.Specifies whether change tracking is enabled disabled for the table. El seguimiento de cambios está deshabilitado de manera predeterminada.By default, change tracking is disabled.

Esta opción solo está disponible cuando el seguimiento de cambios está habilitado para la base de datos.This option is available only when change tracking is enabled for the database. Para obtener más información, vea Opciones de ALTER DATABASE SET.For more information, see ALTER DATABASE SET Options.

Para habilitar el seguimiento de cambios, la tabla debe tener una clave principal.To enable change tracking, the table must have a primary key.

WITH ( TRACK_COLUMNS_UPDATED = { ON | OFF } )WITH ( TRACK_COLUMNS_UPDATED = { ON | OFF } )
Se aplica a: SQL ServerSQL Server (desde SQL Server 2008SQL Server 2008 hasta SQL Server 2017SQL Server 2017) y Base de datos SQL de AzureAzure SQL Database.Applies to: SQL ServerSQL Server ( SQL Server 2008SQL Server 2008 through SQL Server 2017SQL Server 2017) and Base de datos SQL de AzureAzure SQL Database.

Especifica si Motor de base de datosDatabase Engine realiza el seguimiento de las columnas sometidas a seguimiento de cambios que se actualizaron.Specifies whether the Motor de base de datosDatabase Engine tracks, which change tracked columns were updated. El valor predeterminado es OFF.The default value is OFF.

SWITCH [ PARTITION source_partition_number_expression ] TO [ schema_name .SWITCH [ PARTITION source_partition_number_expression ] TO [ schema_name. ] target_table [ PARTITION target_partition_number_expression ]] target_table [ PARTITION target_partition_number_expression ]
Se aplica a: SQL ServerSQL Server (desde SQL Server 2008SQL Server 2008 hasta SQL Server 2017SQL Server 2017) y Base de datos SQL de AzureAzure SQL Database.Applies to: SQL ServerSQL Server ( SQL Server 2008SQL Server 2008 through SQL Server 2017SQL Server 2017) and Base de datos SQL de AzureAzure SQL Database.

Modifica un bloqueo de datos de una de las formas siguientes:Switches a block of data in one of the following ways:

  • Vuelve a asignar todos los datos de una tabla como una partición en una tabla con particiones ya existente.Reassigns all data of a table as a partition to an already-existing partitioned table.
  • Modifica una partición de una tabla con particiones a otra.Switches a partition from one partitioned table to another.
  • Vuelve a asignar todos los datos de una partición de una tabla con particiones a una tabla sin particiones ya existente.Reassigns all data in one partition of a partitioned table to an existing non-partitioned table.

Si table es una tabla con particiones, debe especificarsource_partition_number_expression.If table is a partitioned table, you must specify source_partition_number_expression. Si target_table es una tabla con particiones, debe especificar target_partition_number_expression.If target_table is partitioned, you must specify target_partition_number_expression. Si se vuelven a asignar los datos de una tabla como partición a una tabla con particiones ya existente, o se modifica una partición de una tabla con particiones a otra, la partición de destino debe existir y debe estar vacía.When reassigning a table's data as a partition to an already-existing partitioned table, or switching a partition from one partitioned table to another, the target partition must exist and it must be empty.

Si se vuelven a asignar los datos de una partición para formar una sola tabla, la tabla de destino debe ya estar creada y vacía.When reassigning one partition's data to form a single table, the target table must already exist and it must be empty. Tanto la tabla o partición de origen como la tabla o partición de destino deben residir en el mismo grupo de archivos.Both the source table or partition, and the target table or partition, must be located in the same filegroup. Los índices correspondientes, o particiones de índice, también deben residir en el mismo grupo de archivos.The corresponding indexes, or index partitions, must also be located in the same filegroup. Son muchas las restricciones adicionales que se aplican a las particiones que se modifican.Many additional restrictions apply to switching partitions. table y target_table no pueden ser iguales.table and target_table can't be the same. target_table puede ser un identificador de varias partes.target_table can be a multi-part identifier.

source_partition_number_expression y target_partition_number_expression son expresiones constantes que pueden hacer referencia a funciones y variables.source_partition_number_expression and target_partition_number_expression are constant expressions that can reference variables and functions. Incluyen las variables de tipos definidos por el usuario y las funciones definidas por el usuario.These include user-defined type variables and user-defined functions. No pueden hacer referencia a expresiones de Transact-SQLTransact-SQL.They can't reference Transact-SQLTransact-SQL expressions.

Una tabla con particiones con un índice de almacén de columnas agrupado se comporta como un montón con particiones:A partitioned table with a clustered columstore index behaves like a partitioned heap:

  • La clave principal debe incluir la clave de partición.The primary key must include the partition key.
  • Un índice único debe incluir la clave de partición.A unique index must include the partition key. Sin embargo, incluir la clave de partición con un índice único existente puede cambiar la unicidad.But, including the partition key with an existing unique index can change the uniqueness.
  • Para cambiar de partición, todos los índices no agrupados deben incluir la clave de partición.To switch partitions, all non-clustered indexes must include the partition key.

Para CAMBIAR de restricción al utilizar la replicación, vea Replicar tablas e índices con particiones.For SWITCH restriction when using replication, see Replicate Partitioned Tables and Indexes.

Los índices de almacén de columnas no agrupados compilados para SQL ServerSQL Server 2016 CTP1 y para las versiones de SQL Database anteriores a V12 estaban en un formato de solo lectura.Nonclustered columnstore indexes built for SQL ServerSQL Server 2016 CTP1, and for SQL Database before version V12 were in a read-only format. Debe volver a compilar los índices de almacén de columnas no agrupados en el formato actual (que se puede actualizar) para poder ejecutar cualquier operación de partición.You must rebuild Nonclustered columnstore indexes to the current format (which is updatable) before any PARTITION operations can be run.

SET ( FILESTREAM_ON = { partition_scheme_name | filestream_filegroup_name | " default " | " NULL " } )SET ( FILESTREAM_ON = { partition_scheme_name | filestream_filegroup_name | " default " | " NULL " })
Se aplica a: SQL ServerSQL Server (desde SQL Server 2008SQL Server 2008 hasta SQL Server 2017SQL Server 2017).Applies to: SQL ServerSQL Server ( SQL Server 2008SQL Server 2008 through SQL Server 2017SQL Server 2017). Base de datos SQL de AzureAzure SQL Databaseno admite FILESTREAM.doesn't support FILESTREAM.

Especifica dónde se almacenan los datos FILESTREAM.Specifies where FILESTREAM data is stored.

La ejecución de ALTER TABLE con la cláusula SET FILESTREAM_ON es correcta únicamente si la tabla no tiene columnas FILESTREAM.ALTER TABLE with the SET FILESTREAM_ON clause succeeds only if the table has no FILESTREAM columns. Puede agregar columnas FILESTREAM utilizando una segunda instrucción ALTER TABLE.You can add FILESTREAM columns by using a second ALTER TABLE statement.

Si especifica partition_scheme_name, se aplican las reglas para CREATE TABLE.If you specify partition_scheme_name, the rules for CREATE TABLE apply. Asegúrese de que la tabla tenga ya particiones para los datos de la fila y de que su esquema de partición utilice la misma función de partición y columnas que el esquema de partición de FILESTREAM.Be sure the table is already partitioned for row data, and its partition scheme uses the same partition function and columns as the FILESTREAM partition scheme.

filestream_filegroup_name especifica el nombre de un grupo de archivos FILESTREAM.filestream_filegroup_name specifies the name of a FILESTREAM filegroup. El grupo de archivos debe tener un archivo que esté definido para el grupo de archivos, utilizando para ello las instrucciones CREATE DATABASE o ALTER DATABASE; de lo contrario, se producirá un error.The filegroup must have one file that's defined for the filegroup by using a CREATE DATABASE or ALTER DATABASE statement, or an error results.

" default " especifica el grupo de archivos FILESTREAM con la propiedad DEFAULT establecida." default " specifies the FILESTREAM filegroup with the DEFAULT property set. Si no hay ningún grupo de archivos FILESTREAM, se produce un error.If there's no FILESTREAM filegroup, an error results.

" NULL " especifica que se quitarán todas las referencias a los grupos de archivos FILESTREAM para la tabla." NULL " specifies that all references to FILESTREAM filegroups for the table are removed. Se deben quitar primero todas las columnas FILESTREAM.All FILESTREAM columns must be dropped first. Use SET FILESTREAM_ON =" NULL " para eliminar todos los datos FILESTREAM que estén asociados a una tabla.Use SET FILESTREAM_ON =" NULL " to delete all FILESTREAM data that's associated with a table.

SET ( SYSTEM_VERSIONING = { OFF | ON [ ( HISTORY_TABLE = schema_name .SET ( SYSTEM_VERSIONING = { OFF | ON [ ( HISTORY_TABLE = schema_name . history_table_name [ , DATA_CONSISTENCY_CHECK = { ON | OFF } ]) ] } )history_table_name [ , DATA_CONSISTENCY_CHECK = { ON | OFF } ]) ] } )
Se aplica a: SQL ServerSQL Server (desde SQL Server 2016 (13.x)SQL Server 2016 (13.x) hasta SQL Server 2017SQL Server 2017) y Base de datos SQL de AzureAzure SQL Database.Applies to: SQL ServerSQL Server ( SQL Server 2016 (13.x)SQL Server 2016 (13.x) through SQL Server 2017SQL Server 2017) and Base de datos SQL de AzureAzure SQL Database.

Habilita o deshabilita el control de versiones del sistema de una tabla.Either disables or enables system versioning of a table. Para habilitar el control de versiones del sistema de una tabla, el sistema comprueba que se cumplan los requisitos de restricción del tipo de datos, de la restricción de nulabilidad y de la clave principal para el control de versiones del sistema.To enable system versioning of a table, the system verifies that the datatype, nullability constraint, and primary key constraint requirements for system versioning are met. Si no utiliza el argumento HISTORY_TABLE, el sistema genera una nueva tabla de historial que coincide con el esquema de la tabla actual, crea un vínculo entre las dos tablas y permite que el sistema registre el historial de cada registro de la tabla actual en la tabla de historial.If you don't use the HISTORY_TABLE argument, the system generates a new history table matching the schema of the current table, creates a link between the two tables, and enables the system to record the history of each record in the current table in the history table. El nombre de esta tabla de historial será MSSQL_TemporalHistoryFor<primary_table_object_id>.The name of this history table will be MSSQL_TemporalHistoryFor<primary_table_object_id>. Si usa el argumento HISTORY_TABLE para crear un vínculo a un historial existente y usarlo, el sistema crea un vínculo entre la tabla actual y la tabla especificada.If you use the HISTORY_TABLE argument to create a link to and use an existing history table, the system creates a link between the current table and the specified table. Al crear un vínculo a una tabla de historial existente, puede realizar una comprobación de coherencia de datos.When creating a link to an existing history table, you can choose to do a data consistency check. Esta comprobación de coherencia de datos garantiza que los registros existentes no se superponen.This data consistency check ensures that existing records don't overlap. La comprobación de coherencia de datos se ejecuta de manera predeterminada.Running the data consistency check is the default. Para obtener más información, consulte Temporal Tables.For more information, see Temporal Tables.

HISTORY_RETENTION_PERIOD = { INFINITE | number {DAY | DAYS | WEEK | WEEKS | MONTH | MONTHS | YEAR | YEARS} }HISTORY_RETENTION_PERIOD = { INFINITE | number {DAY | DAYS | WEEK | WEEKS | MONTH | MONTHS | YEAR | YEARS} }
Se aplica a: SQL Server 2017 (14.x)SQL Server 2017 (14.x) y Base de datos SQL de AzureAzure SQL Database.Applies to: SQL Server 2017 (14.x)SQL Server 2017 (14.x) and Base de datos SQL de AzureAzure SQL Database.

Especifica la retención finita o infinita de los datos del historial en la tabla temporal.Specifies finite or infinite retention for historical data in a temporal table. Si se omite, se presupone la retención infinita.If omitted, infinite retention is assumed.

SET ( LOCK_ESCALATION = { AUTO | TABLE | DISABLE } )SET ( LOCK_ESCALATION = { AUTO | TABLE | DISABLE } )
Se aplica a: SQL ServerSQL Server (desde SQL Server 2008SQL Server 2008 hasta SQL Server 2017SQL Server 2017) y Base de datos SQL de AzureAzure SQL Database.Applies to: SQL ServerSQL Server ( SQL Server 2008SQL Server 2008 through SQL Server 2017SQL Server 2017) and Base de datos SQL de AzureAzure SQL Database.

Especifica los métodos permitidos de extensión de bloqueo para una tabla.Specifies the allowed methods of lock escalation for a table.

AUTOAUTO
Esta opción permite a Motor de base de datos de SQL ServerSQL Server Database Engine seleccionar la granularidad de la extensión de bloqueo que sea adecuada para el esquema de tabla.This option allows Motor de base de datos de SQL ServerSQL Server Database Engine to select the lock escalation granularity that's appropriate for the table schema.

  • Si la tabla tiene particiones, la extensión del bloqueo se permite en la partición.If the table is partitioned, lock escalation is allowed to partition. Una vez realizada la extensión del bloqueo hasta el nivel de la partición, el bloqueo no se extiende a la granularidad de TABLE más adelante.After the lock is escalated to the partition level, the lock won't be escalated later to TABLE granularity.
  • Si la tabla no tiene particiones, la extensión del bloqueo se aplica a la granularidad de TABLE.If the table isn't partitioned, the lock escalation is done to the TABLE granularity.

TABLETABLE
La extensión de bloqueo se aplica a la granularidad en el nivel de tabla, independientemente de que la tabla tenga o no particiones.Lock escalation is done at table-level granularity whether the table is partitioned or not partitioned. TABLE es el valor predeterminado.TABLE is the default value.

DISABLEDISABLE
Evita la extensión de bloqueo en la mayoría de los casos.Prevents lock escalation in most cases. No siempre se evitan los bloqueos de nivel de la tabla.Table-level locks aren't completely disallowed. Por ejemplo, si está examinando una tabla que no tiene ningún índice agrupado en el nivel de aislamiento serializable, Motor de base de datosDatabase Engine debe realizar un bloqueo de la tabla para proteger la integridad de los datos.For example, when you're scanning a table that has no clustered index under the serializable isolation level, Motor de base de datosDatabase Engine must take a table lock to protect data integrity.

REBUILDREBUILD
Utilice la sintaxis de REBUILD WITH para volver a generar una tabla completa que incluya todas las particiones en una tabla con particiones.Use the REBUILD WITH syntax to rebuild an entire table including all the partitions in a partitioned table. Si la tabla tiene un índice clúster, la opción REBUILD vuelve a generarlo.If the table has a clustered index, the REBUILD option rebuilds the clustered index. REBUILD se puede ejecutar como una operación ONLINE.REBUILD can be run as an ONLINE operation.

Utilice la sintaxis de REBUILD PARTITION para volver a generar una partición única en una tabla con particiones.Use the REBUILD PARTITION syntax to rebuild a single partition in a partitioned table.

PARTITION = ALLPARTITION = ALL
Se aplica a: SQL ServerSQL Server (desde SQL Server 2008SQL Server 2008 hasta SQL Server 2017SQL Server 2017) y Base de datos SQL de AzureAzure SQL Database.Applies to: SQL ServerSQL Server ( SQL Server 2008SQL Server 2008 through SQL Server 2017SQL Server 2017) and Base de datos SQL de AzureAzure SQL Database.

Vuelve a generar todas las particiones al cambiar los valores de compresión de la partición.Rebuilds all partitions when changing the partition compression settings.

REBUILD WITH ( <rebuild_option> )REBUILD WITH ( <rebuild_option> )
Todas las opciones se aplican a una tabla con un índice agrupado.All options apply to a table with a clustered index. Si la tabla no tiene un índice agrupado, solo algunas de las opciones afectan a la estructura del montón.If the table doesn't have a clustered index, the heap structure is only affected by some of the options.

Cuando no se especifica un valor de compresión específico con la operación REBUILD, se usa el valor de compresión actual de la partición.When a specific compression setting isn't specified with the REBUILD operation, the current compression setting for the partition is used. Para devolver el valor actual, realice una consulta en la columna data_compression de la vista del catálogo sys.partitions.To return the current setting, query the data_compression column in the sys.partitions catalog view.

Para obtener una descripción completa de las opciones de recompilación, vea index_option.For complete descriptions of the rebuild options, see index_option.

DATA_COMPRESSIONDATA_COMPRESSION
Se aplica a: SQL ServerSQL Server (desde SQL Server 2008SQL Server 2008 hasta SQL Server 2017SQL Server 2017) y Base de datos SQL de AzureAzure SQL Database.Applies to: SQL ServerSQL Server ( SQL Server 2008SQL Server 2008 through SQL Server 2017SQL Server 2017) and Base de datos SQL de AzureAzure SQL Database.

Especifica la opción de compresión de datos para la tabla, el número de partición o el intervalo de particiones especificados.Specifies the data compression option for the specified table, partition number, or range of partitions. Las opciones son las siguientes:The options are as follows:

NONE No se comprimen la tabla ni las particiones especificadas.NONE Table or specified partitions aren't compressed. Esta opción no se aplica a las tablas del almacén de columnas.This option doesn't apply to columnstore tables.

ROW La tabla o las particiones especificadas se comprimen utilizando la compresión de fila.ROW Table or specified partitions are compressed by using row compression. Esta opción no se aplica a las tablas del almacén de columnas.This option doesn't apply to columnstore tables.

PAGE La tabla o las particiones especificadas se comprimen utilizando la compresión de página.PAGE Table or specified partitions are compressed by using page compression. Esta opción no se aplica a las tablas del almacén de columnas.This option doesn't apply to columnstore tables.

COLUMNSTORECOLUMNSTORE
Se aplica a: SQL ServerSQL Server (desde SQL Server 2014 (12.x)SQL Server 2014 (12.x) hasta SQL Server 2017SQL Server 2017) y Base de datos SQL de AzureAzure SQL Database.Applies to: SQL ServerSQL Server ( SQL Server 2014 (12.x)SQL Server 2014 (12.x) through SQL Server 2017SQL Server 2017) and Base de datos SQL de AzureAzure SQL Database.

Solo se aplica a tablas de almacén de columnas.Applies only to columnstore tables. COLUMNSTORE especifica que se descomprima una partición que se comprimió con la opción COLUMNSTORE_ARCHIVE.COLUMNSTORE specifies to decompress a partition that was compressed with the COLUMNSTORE_ARCHIVE option. Cuando se restauran los datos, siguen estando comprimidos con la compresión de almacén de columnas que se usa para todas las tablas de almacén de columnas.When the data is restored, it continues to be compressed with the columnstore compression that's used for all columnstore tables.

COLUMNSTORE_ARCHIVECOLUMNSTORE_ARCHIVE
Se aplica a: SQL ServerSQL Server (desde SQL Server 2014 (12.x)SQL Server 2014 (12.x) hasta SQL Server 2017SQL Server 2017) y Base de datos SQL de AzureAzure SQL Database.Applies to: SQL ServerSQL Server ( SQL Server 2014 (12.x)SQL Server 2014 (12.x) through SQL Server 2017SQL Server 2017) and Base de datos SQL de AzureAzure SQL Database.

Solo se aplica a las tablas de almacén de columnas almacenadas con un índice clúster de almacén de columnas.Applies only to columnstore tables, which are tables stored with a clustered columnstore index. COLUMNSTORE_ARCHIVE comprimirá aún más la partición especificada a un tamaño mínimo.COLUMNSTORE_ARCHIVE will further compress the specified partition to a smaller size. Use esta opción para el archivado o para otras situaciones que requieran menos almacenamiento y en las que pueda permitirse más tiempo para el almacenamiento y recuperación.Use this option for archival or other situations that require less storage and can afford more time for storage and retrieval.

Para volver a generar al mismo tiempo varias particiones, vea index_option.To rebuild multiple partitions at the same time, see index_option. Si la tabla no tiene un índice agrupado, al cambiar la compresión de datos se vuelven a generar el montón y los índices no agrupados.If the table doesn't have a clustered index, changing the data compression rebuilds the heap and the nonclustered indexes. Para más información sobre la compresión, vea Compresión de datos.For more information about compression, see Data Compression.

ONLINE = { ON | OFF } <tal y como se aplica a single_partition_rebuild_option>ONLINE = { ON | OFF } <as applies to single_partition_rebuild_option>
Especifica si una única partición de las tablas subyacentes y los índices asociados están disponibles para realizar consultas y modificar datos durante la operación de indización.Specifies whether a single partition of the underlying tables and associated indexes is available for queries and data modification during the index operation. El valor predeterminado es OFF.The default is OFF. Puede ejecutar REBUILD como una operación ONLINE.You can run REBUILD as an ONLINE operation.

ONON
Los bloqueos de tabla de larga duración no se mantienen durante la operación de indización.Long-term table locks aren't held for the duration of the index operation. Requiere un bloqueo S en la tabla al principio de la recompilación del índice y un bloqueo Sch-M en la tabla en el extremo de la recompilación de índice en línea.S-lock on the table is required in the beginning of the index rebuild and a Sch-M lock on the table at the end of the online index rebuild. Aunque ambos bloqueos son bloqueos de metadatos cortos, el bloqueo Sch-M debe esperar a que todas las transacciones de bloqueo se completen.Although both locks are short metadata locks, the Sch-M lock must wait for all blocking transactions to be completed. Durante el tiempo de espera, el bloqueo Sch-M bloquea las demás transacciones que esperen a este bloqueo al tener acceso a la misma tabla.During the wait time,, the Sch-M lock blocks all other transactions that wait behind this lock when accessing the same table.

Nota

La regeneración de índice en línea puede establecer las opciones low_priority_lock_wait que se describen más adelante en esta sección.Online index rebuild can set the low_priority_lock_wait options described later in this section.

OFFOFF
Los bloqueos de tabla se aplican durante la operación de índice.Table locks are applied for the duration of the index operation. Esto evita que todos los usuarios tengan acceso a la tabla subyacente durante la operación.This prevents all user access to the underlying table for the duration of the operation.

column_set_name XML COLUMN_SET FOR ALL_SPARSE_COLUMNScolumn_set_name XML COLUMN_SET FOR ALL_SPARSE_COLUMNS
Se aplica a: SQL ServerSQL Server (desde SQL Server 2008SQL Server 2008 hasta SQL Server 2017SQL Server 2017) y Base de datos SQL de AzureAzure SQL Database.Applies to: SQL ServerSQL Server ( SQL Server 2008SQL Server 2008 through SQL Server 2017SQL Server 2017) and Base de datos SQL de AzureAzure SQL Database.

El nombre del conjunto de columnas.The name of the column set. Un conjunto de columnas es una representación XML sin tipo que combina todas las columnas dispersas de una tabla en una salida estructurada.A column set is an untyped XML representation that combines all of the sparse columns of a table into a structured output. No se puede agregar un conjunto de columnas a una tabla que contenga columnas dispersas.A column set can't be added to a table that contains sparse columns. Para obtener más información sobre los conjuntos de columnas, vea Usar conjuntos de columnas.For more information about column sets, see Use Column Sets.

{ ENABLE | DISABLE } FILETABLE_NAMESPACE{ ENABLE | DISABLE } FILETABLE_NAMESPACE
Se aplica a: SQL ServerSQL Server (desde SQL Server 2012 (11.x)SQL Server 2012 (11.x) hasta SQL Server 2017SQL Server 2017).Applies to: SQL ServerSQL Server ( SQL Server 2012 (11.x)SQL Server 2012 (11.x) through SQL Server 2017SQL Server 2017).

Habilita o deshabilita las restricciones definidas por el sistema en un objeto FileTable.Enables or disables the system-defined constraints on a FileTable. Solo se puede utilizar con un objeto FileTable.Can only be used with a FileTable.

SET ( FILETABLE_DIRECTORY = directory_name )SET ( FILETABLE_DIRECTORY = directory_name )
Se aplica a: SQL ServerSQL Server ) desde SQL Server 2012 (11.x)SQL Server 2012 (11.x) hasta SQL Server 2017SQL Server 2017.Applies to: SQL ServerSQL Server ) SQL Server 2012 (11.x)SQL Server 2012 (11.x) through SQL Server 2017SQL Server 2017. Base de datos SQL de AzureAzure SQL Database no es compatible con FILETABLE.doesn't support FILETABLE.

Especifica el nombre de directorio de FileTable compatible con Windows.Specifies the Windows-compatible FileTable directory name. Este nombre debe ser único entre todos los nombres de directorio de FileTable en la base de datos.This name should be unique among all the FileTable directory names in the database. La comparación de unicidad no distingue mayúsculas de minúsculas, a pesar de la configuración de intercalación de SQL.Uniqueness comparison is case-insensitive, despite the SQL collation settings. Solo se puede utilizar con un objeto FileTable.Can only be used with a FileTable.

 SET (
        REMOTE_DATA_ARCHIVE
        {
            = ON (<table_stretch_options> )
          | = OFF_WITHOUT_DATA_RECOVERY
          ( MIGRATION_STATE = PAUSED ) | ( <table_stretch_options> [, ...n] )
        } )

Se aplica a: SQL ServerSQL Server (SQL Server 2017 (14.x)SQL Server 2017 (14.x) hasta SQL Server 2017SQL Server 2017).Applies to: SQL ServerSQL Server (SQL Server 2017 (14.x)SQL Server 2017 (14.x) through SQL Server 2017SQL Server 2017).

Habilita o deshabilita Stretch Database para una tabla.Enables or disables Stretch Database for a table. Para obtener más información, vea Stretch Database.For more information, see Stretch Database.

Habilitar Stretch Database para una tablaEnabling Stretch Database for a table

Al habilitar Stretch para una tabla especificando ON, también tiene que especificar MIGRATION_STATE = OUTBOUND para empezar a migrar los datos inmediatamente o MIGRATION_STATE = PAUSED para posponer la migración de datos.When you enable Stretch for a table by specifying ON, you also have to specify MIGRATION_STATE = OUTBOUND to begin migrating data immediately, or MIGRATION_STATE = PAUSED to postpone data migration. El valor predeterminado es MIGRATION_STATE = OUTBOUND.The default value is MIGRATION_STATE = OUTBOUND. Para más información sobre la habilitación de Stretch para una tabla, vea Enable Stretch Database for a table (Habilitar Stretch Database para una tabla).For more information about enabling Stretch for a table, see Enable Stretch Database for a table.

Requisitos previos.Prerequisites. Para poder habilitar Stretch para una tabla, primero tiene que habilitar Stretch en el servidor y en la base de datos.Before you enable Stretch for a table, you have to enable Stretch on the server and on the database. Para obtener más información, vea Enable Stretch Database for a database (Habilitar Stretch Database para una tabla).For more information, see Enable Stretch Database for a database.

Permisos.Permissions. Para habilitar Stretch para una base de datos o una tabla se necesitan permisos db_owner.Enabling Stretch for a database or a table requires db_owner permissions. Además, para habilitar Stretch para una tabla, también se requieren permisos ALTER en la tabla.Enabling Stretch for a table also requires ALTER permissions on the table.

Deshabilitar Stretch Database para una tablaDisabling Stretch Database for a table

Al deshabilitar Stretch para una tabla, tiene dos opciones para los datos remotos que ya se han migrado a Azure.When you disable Stretch for a table, you have two options for the remote data that's already been migrated to Azure. Para obtener más información, vea Deshabilitar Stretch Database y recuperar datos remotos.For more information, see Disable Stretch Database and bring back remote data.

  • Para deshabilitar Stretch para una tabla y copiar los datos remotos de la tabla de Azure en SQL Server, ejecute el siguiente comando.To disable Stretch for a table and copy the remote data for the table from Azure back to SQL Server, run the following command. Este comando no se puede cancelar.This command can't be canceled.

    ALTER TABLE <table_name>
       SET ( REMOTE_DATA_ARCHIVE ( MIGRATION_STATE = INBOUND ) ) ;
    

Esta operación conlleva gastos de transferencia de datos y no se puede cancelar.This operation incurs data transfer costs, and it can't be canceled. Para obtener más información, consulte Detalles de precios de Transferencias de datos.For more information, see Data Transfers Pricing Details.

Una vez que todos los datos remotos se han copiado desde Azure en SQL Server, se deshabilita Stretch para la tabla.After all the remote data has been copied from Azure back to SQL Server, Stretch is disabled for the table.

  • Para deshabilitar Stretch para una tabla y abandonar los datos remotos, ejecute el siguiente comando.To disable Stretch for a table and abandon the remote data, run the following command.

    ALTER TABLE <table_name>
       SET ( REMOTE_DATA_ARCHIVE = OFF_WITHOUT_DATA_RECOVERY ( MIGRATION_STATE = PAUSED ) ) ;
    

Después de deshabilitar Stretch Database para una tabla, se detiene la migración de datos y los resultados de la consulta ya no incluyen los resultados de la tabla remota.After you disable Stretch Database for a table, data migration stops and query results no longer include results from the remote table.

Al deshabilitar Stretch no se quita la tabla remota.Disabling Stretch doesn't remove the remote table. Si quiere eliminar la tabla remota, tiene que quitarla mediante Azure Portal.If you want to delete the remote table, you drop it by using the Azure portal.

[ FILTER_PREDICATE = { null | predicate } ][ FILTER_PREDICATE = { null | predicate } ]
Se aplica a: SQL ServerSQL Server (SQL Server 2017 (14.x)SQL Server 2017 (14.x) hasta SQL Server 2017SQL Server 2017).Applies to: SQL ServerSQL Server (SQL Server 2017 (14.x)SQL Server 2017 (14.x) through SQL Server 2017SQL Server 2017).

Especifica opcionalmente un predicado de filtro para seleccionar las filas que se migrarán desde una tabla que contiene datos históricos y datos actuales.Optionally specifies a filter predicate to select rows to migrate from a table that contains both historical and current data. El predicado debe llamar a una función determinista con valores de tabla insertada.The predicate must call a deterministic inline table-valued function. Para obtener más información, consulte Enable Stretch Database para una tabla (Habilitar Stretch Database para una tabla) y Seleccionar las filas que se van a migrar mediante una función de filtro (Stretch Database).For more information, see Enable Stretch Database for a table and Select rows to migrate by using a filter function - Stretch Database.

Importante

Si se indica un predicado de filtro que tiene un rendimiento bajo, la migración de datos también tendrá un rendimiento bajo.If you provide a filter predicate that performs poorly, data migration also performs poorly. Stretch Database aplica el predicado de filtro a la tabla mediante el operador CROSS APPLY.Stretch Database applies the filter predicate to the table by using the CROSS APPLY operator.

Si no se especifica un predicado de filtro, se migrará toda la tabla.If you don't specify a filter predicate, the entire table is migrated.

Cuando se especifica un predicado de filtro, también hay que especificar MIGRATION_STATE.When you specify a filter predicate, you also have to specify MIGRATION_STATE.

MIGRATION_STATE = { OUTBOUND | INBOUND | PAUSED }MIGRATION_STATE = { OUTBOUND | INBOUND | PAUSED }
Se aplica a: SQL ServerSQL Server (SQL Server 2017 (14.x)SQL Server 2017 (14.x) hasta SQL Server 2017SQL Server 2017).Applies to: SQL ServerSQL Server (SQL Server 2017 (14.x)SQL Server 2017 (14.x) through SQL Server 2017SQL Server 2017).

WAIT_AT_LOW_PRIORITYWAIT_AT_LOW_PRIORITY
Se aplica a: SQL ServerSQL Server (desde SQL Server 2014 (12.x)SQL Server 2014 (12.x) hasta SQL Server 2017SQL Server 2017) y Base de datos SQL de AzureAzure SQL Database.Applies to: SQL ServerSQL Server ( SQL Server 2014 (12.x)SQL Server 2014 (12.x) through SQL Server 2017SQL Server 2017) and Base de datos SQL de AzureAzure SQL Database.

Una recompilación de índices en línea tiene que esperar a las operaciones de bloqueo en esta tabla.An online index rebuild has to wait for blocking operations on this table. WAIT_AT_LOW_PRIORITY indica que la operación de regeneración de índice en línea espera a los bloqueos de prioridad baja, de forma que otras operaciones pueden continuar mientras la operación de generación de índice en línea está en espera.WAIT_AT_LOW_PRIORITY indicates that the online index rebuild operation waits for low-priority locks, allowing other operations to carry on while the online index build operation is waiting. Omitir la opción WAIT AT LOW PRIORITY equivale a WAIT_AT_LOW_PRIORITY ( MAX_DURATION = 0 minutes, ABORT_AFTER_WAIT = NONE).Omitting the WAIT AT LOW PRIORITY option is the same as WAIT_AT_LOW_PRIORITY ( MAX_DURATION = 0 minutes, ABORT_AFTER_WAIT = NONE).

MAX_DURATION = time [MINUTES ]MAX_DURATION = time [MINUTES ]
Se aplica a: SQL ServerSQL Server (desde SQL Server 2014 (12.x)SQL Server 2014 (12.x) hasta SQL Server 2017SQL Server 2017) y Base de datos SQL de AzureAzure SQL Database.Applies to: SQL ServerSQL Server ( SQL Server 2014 (12.x)SQL Server 2014 (12.x) through SQL Server 2017SQL Server 2017) and Base de datos SQL de AzureAzure SQL Database.

El tiempo de espera (valor entero especificado en minutos) que SWITCH o los bloqueos de la operación de recompilación de índices en línea esperan con prioridad baja al ejecutar el comando DDL.The wait time, which is an integer value specified in minutes, that the SWITCH or online index rebuild locks wait with low priority when running the DDL command. Si la operación se bloquea durante el tiempo de MAX_DURATION, se ejecutará una de las acciones ABORT_AFTER_WAIT.If the operation is blocked for the MAX_DURATION time, one of the ABORT_AFTER_WAIT actions will run. El tiempo de MAX_DURATION siempre es en minutos y la palabra MINUTES puede omitirse.MAX_DURATION time is always in minutes, and you can omit the word MINUTES.

ABORT_AFTER_WAIT = [NONE | SELF | BLOCKERS } ]ABORT_AFTER_WAIT = [NONE | SELF | BLOCKERS } ]
Se aplica a: SQL ServerSQL Server (desde SQL Server 2014 (12.x)SQL Server 2014 (12.x) hasta SQL Server 2017SQL Server 2017) y Base de datos SQL de AzureAzure SQL Database.Applies to: SQL ServerSQL Server ( SQL Server 2014 (12.x)SQL Server 2014 (12.x) through SQL Server 2017SQL Server 2017) and Base de datos SQL de AzureAzure SQL Database.

NingunoNONE
Se continúa esperando al bloqueo con prioridad normal.Continue waiting for the lock with normal (regular) priority.

SELFSELF
Sale de la operación DDL SWITCH o regeneración de índices en línea que se está ejecutando actualmente sin realizar ninguna acción.Exit the SWITCH or online index rebuild DDL operation currently being run without taking any action.

BLOCKERSBLOCKERS
Elimina todas las transacciones de usuario que están bloqueando la operación DDL SWITCH o la regeneración de índices en línea de forma que la operación pueda continuar.Kill all user transactions that currently block the SWITCH or online index rebuild DDL operation so that the operation can continue.

Requiere el permiso ALTER ANY CONNECTION.Requires ALTER ANY CONNECTION permission.

IF EXISTSIF EXISTS
Se aplica a: SQL ServerSQL Server (desde SQL Server 2016 (13.x)SQL Server 2016 (13.x) hasta SQL Server 2017SQL Server 2017) y Base de datos SQL de AzureAzure SQL Database.Applies to: SQL ServerSQL Server ( SQL Server 2016 (13.x)SQL Server 2016 (13.x) through SQL Server 2017SQL Server 2017) and Base de datos SQL de AzureAzure SQL Database.

Quita condicionalmente la columna o restricción solo si ya existe.Conditionally drops the column or constraint only if it already exists.

NotasRemarks

Para agregar nuevas filas de datos, utilice INSERT.To add new rows of data, use INSERT. Para quitar filas de datos, utilice DELETE o TRUNCATE TABLE.To remove rows of data, use DELETE or TRUNCATE TABLE. Para cambiar los valores de las filas existentes, utilice UPDATE.To change the values in existing rows, use UPDATE.

Si hubiera algún plan de ejecución en la memoria caché del procedimiento que hace referencia a la tabla, ALTER TABLE los marca para que se vuelvan a compilar en la siguiente ejecución.If there are any execution plans in the procedure cache that reference the table, ALTER TABLE marks them to be recompiled on their next execution.

Cambiar el tamaño de una columnaChanging the Size of a Column

Puede cambiar la longitud, precisión o escala de una columna especificando un nuevo tamaño para el tipo de datos de columna.You can change the length, precision, or scale of a column by specifying a new size for the column data type. Utilice la cláusula ALTER COLUMN.Use the ALTER COLUMN clause. Si hay datos en la columna, el nuevo tamaño no puede ser menor que el tamaño máximo de los datos.If data exists in the column, the new size can't be smaller than the maximum size of the data. Asimismo, no puede definir la columna en un índice, a menos que sea de un tipo de datos varchar, nvarchar o varbinary, y el índice no sea el resultado de una restricción KEY PRIMARY.Also, you can't define the column in an index, unless the column is a varchar, nvarchar, or varbinary data type and the index isn't the result of a PRIMARY KEY constraint. Vea el ejemplo en la breve sección titulada Modificación de una definición de columna.See the example in the short section titled Altering a Column Definition.

Bloqueos y ALTER TABLELocks and ALTER TABLE

Los cambios que especifique en ALTER TABLE se implementan inmediatamente.Changes you specify in ALTER TABLE implement immediately. Si los cambios requieren modificaciones de las filas de la tabla, ALTER TABLE actualiza las filas.If the changes require modifications of the rows in the table, ALTER TABLE updates the rows. ALTER TABLE adquiere un bloqueo de modificación del esquema (SCH-M) sobre la tabla para asegurar que ninguna otra conexión haga referencia ni a los metadatos de la tabla durante el cambio, excepto las operaciones de indización en línea que precisen un breve bloqueo SCH-M al final.ALTER TABLE acquires a schema modify (SCH-M) lock on the table to make sure that no other connections reference even the metadata for the table during the change, except online index operations that require a short SCH-M lock at the end. En una operación ALTER TABLE...SWITCH, el bloqueo se adquiere tanto en las tablas de origen como en las de destino.In an ALTER TABLE...SWITCH operation, the lock is acquired on both the source and target tables. Las modificaciones realizadas en la tabla se registran y son completamente recuperables.The modifications made to the table are logged and fully recoverable. Los cambios que afectan a todas las filas de tablas grandes, como quitar una columna o, en algunas ediciones de SQL ServerSQL Server, agregar una columna NOT NULL con un valor predeterminado, pueden tardar mucho tiempo en completarse y generan muchos registros.Changes that affect all the rows in large tables, such as dropping a column or, on some editions of SQL ServerSQL Server, adding a NOT NULL column with a default value, can take a long time to complete and generate many log records. Ejecute estas instrucciones ALTER TABLE con el mismo cuidado que cualquier instrucción INSERT, UPDATE o DELETE que afecte a un gran número de filas.Run these ALTER TABLE statements with the same care as any INSERT, UPDATE, or DELETE statement that affects many rows.

Agregar columnas NOT NULL como una operación en líneaAdding NOT NULL Columns as an Online Operation

A partir de SQL Server 2012 (11.x)SQL Server 2012 (11.x) Enterprise Edition, agregar una columna NOT NULL con un valor predeterminado es una operación en línea cuando el valor predeterminado es una constante de tiempo de ejecución.Starting with SQL Server 2012 (11.x)SQL Server 2012 (11.x) Enterprise Edition, adding a NOT NULL column with a default value is an online operation when the default value is a runtime constant. Esto significa que la operación se ha completado de forma casi instantánea, a pesar del número de filas de la tabla.This means that the operation is completed almost instantaneously despite the number of rows in the table. Esto se debe a que las filas existentes en la tabla no se actualizan durante la operación.Because, the existing rows in the table aren't updated during the operation. En su lugar, el valor predeterminado se almacena únicamente en los metadatos de la tabla y el valor se busca según sea necesario en las consultas que tienen acceso a estas filas.Instead, the default value is stored only in the metadata of the table and the value is looked up, as needed, in queries that access these rows. Este comportamiento es automático.This behavior is automatic. No se requiere sintaxis adicional alguna para implementar la operación en línea aparte de la sintaxis de COLUMN ADD.No additional syntax is required to implement the online operation beyond the ADD COLUMN syntax. Una constante de tiempo de ejecución es una expresión que genera el mismo valor en tiempo de ejecución para cada fila de la tabla, a pesar de su determinismo.A runtime constant is an expression that produces the same value at runtime for each row in the table despite its determinism. Por ejemplo, la expresión constante “mis datos temporales” o la función del sistema GETUTCDATETIME() son constantes de tiempo de ejecución.For example, the constant expression "My temporary data", or the system function GETUTCDATETIME() are runtime constants. En cambio, las funciones NEWID() o NEWSEQUENTIALID() no son constantes de tiempo de ejecución porque se genera un valor único para cada fila de la tabla.In contrast, the functions NEWID() or NEWSEQUENTIALID() aren't runtime constants, because a unique value is produced for each row in the table. Cuando se agrega una columna NOT NULL con un valor predeterminado que no es una constante de tiempo de ejecución, se ejecuta siempre sin conexión y se adquiere un bloqueo exclusivo (SCH-M) mientras dura la operación.Adding a NOT NULL column with a default value that's not a runtime constant is always run offline and an exclusive (SCH-M) lock is acquired for the duration of the operation.

Mientras que las filas existentes hacen referencia al valor almacenado en los metadatos, el valor predeterminado se almacena en la fila para aquellas filas nuevas que se inserten y que no especifiquen otro valor para la columna.While the existing rows reference the value stored in metadata, the default value is stored on the row for any new rows that are inserted and don't specify another value for the column. El valor predeterminado que se almacena en los metadatos se traslada a una fila existente cuando se actualiza la fila (aunque la columna real no se especifique en la instrucción UPDATE) o bien, si la tabla o el índice agrupado se vuelve a generar.The default value stored in metadata moves to an existing row when the row is updated (even if the actual column isn't specified in the UPDATE statement), or if the table or clustered index is rebuilt.

Las columnas de tipo varchar(max) , nvarchar(max) , varbinary(max) , xml, text, ntext, image, hierarchyid, geometry, geography o CLR UDTS no se pueden agregar en una operación en línea.Columns of type varchar(max), nvarchar(max), varbinary(max), xml, text, ntext, image, hierarchyid, geometry, geography, or CLR UDTS, can't be added in an online operation. Una columna no se puede agregar en línea si al hacerlo provoca que el tamaño máximo posible de fila supere el límite de 8.060 bytes.A column can't be added online if doing so causes the maximum possible row size to exceed the 8,060-byte limit. En este caso, la columna se agrega como una operación sin conexión.The column is added as an offline operation in this case.

Ejecutar planes paralelosParallel Plan Execution

En Microsoft SQL Server 2012 EnterpriseMicrosoft SQL Server 2012 Enterprise y versiones posteriores, el número de procesadores utilizados para ejecutar una sola instrucción ALTER TABLE ADD (basada en índices) CONSTRAINT o DROP (índice agrupado) CONSTRAINT viene determinado por la opción de configuración grado máximo de paralelismo y la carga de trabajo actual.In Microsoft SQL Server 2012 EnterpriseMicrosoft SQL Server 2012 Enterprise and higher, the number of processors employed to run a single ALTER TABLE ADD (index-based) CONSTRAINT or DROP (clustered index) CONSTRAINT statement is determined by the max degree of parallelism configuration option and the current workload. Si el Motor de base de datosDatabase Engine detecta que el sistema está ocupado, el grado de paralelismo de la operación se reduce automáticamente antes de comenzar la ejecución de la instrucción.If the Motor de base de datosDatabase Engine detects that the system is busy, the degree of parallelism of the operation is automatically reduced before statement execution starts. Puede configurar manualmente el número de procesadores que se utilizan para ejecutar la instrucción si especifica la opción MAXDOP.You can manually configure the number of processors that are used to run the statement by specifying the MAXDOP option. Para obtener más información, vea Establecer la opción de configuración del servidor Grado máximo de paralelismo.For more information, see Configure the max degree of parallelism Server Configuration Option.

Tablas con particionesPartitioned Tables

Además de realizar operaciones SWITCH que implican a tablas con particiones, use ALTER TABLE para cambiar el estado de las columnas, restricciones y desencadenadores de una tabla con particiones, de la misma forma que se utiliza para las tablas sin particiones.In addition to performing SWITCH operations that involve partitioned tables, use ALTER TABLE to change the state of the columns, constraints, and triggers of a partitioned table just like it's used for nonpartitioned tables. Sin embargo, esta instrucción no puede utilizarse para cambiar la forma en que se realizan las particiones de la tabla misma.However, this statement can't be used to change the way the table itself is partitioned. Para volver a realizar las particiones de una tabla con particiones, utilice ALTER PARTITION SCHEME y ALTER PARTITION FUNCTION.To repartition a partitioned table, use ALTER PARTITION SCHEME and ALTER PARTITION FUNCTION. Además, no puede cambiar el tipo de datos de una columna de una tabla con particiones.Additionally, you can't change the data type of a column of a partitioned table.

Realizar restricciones en tablas con vistas enlazadas a esquemaRestrictions on Tables with Schema-Bound Views

Las restricciones que se aplican a instrucciones ALTER TABLE en tablas con vistas enlazadas a esquema son las mismas que las restricciones que se aplican actualmente cuando se alteran tablas con un solo índice.The restrictions that apply to ALTER TABLE statements on tables with schema-bound views are the same as the restrictions currently applied when modifying tables with a simple index. Se permite agregar una columna.Adding a column is allowed. No obstante, no se permite quitar ni cambiar una columna que participa en una vista enlazada a esquema.However, removing or changing a column that participates in any schema-bound view isn't allowed. Si la instrucción ALTER TABLE requiere la alteración de una columna que se utiliza en una vista enlazada a esquema, se produce un error en ALTER TABLE y el Motor de base de datosDatabase Engine genera un mensaje de error.If the ALTER TABLE statement requires changing a column used in a schema-bound view, ALTER TABLE fails and the Motor de base de datosDatabase Engine raises an error message. Para obtener más información acerca de los enlaces a esquemas y vistas indizadas, vea CREATE VIEW.For more information about schema binding and indexed views, see CREATE VIEW.

La creación de una vista enlazada a esquema que hace referencia a las tablas no afecta a la adición ni a la eliminación de desencadenadores en las tablas base.Adding or removing triggers on base tables isn't affected by creating a schema-bound view that references the tables.

Índices y ALTER TABLEIndexes and ALTER TABLE

Los índices creados como parte de una restricción se quitan cuando se quita la restricción.Indexes created as part of a constraint are dropped when the constraint is dropped. Los índices que se crearon con CREATE INDEX deben quitarse con DROP INDEX.Indexes that were created with CREATE INDEX must be dropped with DROP INDEX. Use la instrucción ALTER INDEX para volver a crear un índice que es parte de una definición de restricción; no es necesario quitar o agregar de nuevo la restricción con ALTER TABLE.Use The ALTER INDEX statement to rebuild an index part of a constraint definition; the constraint doesn't have to be dropped and added again with ALTER TABLE.

Todos los índices y restricciones basados en una columna deben eliminarse para que se pueda quitar la columna.All indexes and constraints based on a column must be removed before the column can be removed.

Cuando elimina una restricción que ha creado un índice agrupado, las filas de datos que se han almacenado en el nivel hoja del índice agrupado se almacenan en una tabla no agrupada.When you delete a constraint that created a clustered index, the data rows that were stored in the leaf level of the clustered index are stored in a nonclustered table. Puede quitar el índice clúster y mover la tabla resultante a otro grupo de archivos o esquema de partición en una sola transacción especificando la opción MOVE TO.You can drop the clustered index and move the resulting table to another filegroup or partition scheme in a single transaction by specifying the MOVE TO option. La opción MOVE TO tiene las siguientes restricciones:The MOVE TO option has the following restrictions:

  • MOVE TO no es válido para vistas indizadas o índices no agrupados.MOVE TO isn't valid for indexed views or nonclustered indexes.
  • El esquema de partición o el grupo de archivos debe existir previamente.The partition scheme or filegroup must already exist.
  • Si no se especifica MOVE TO, la tabla se ubica en el mismo esquema de partición o grupo de archivos que se definió para el índice agrupado.If MOVE TO isn't specified, the table is located in the same partition scheme or filegroup as was defined for the clustered index.

Cuando quite un índice agrupado, especifique la opción ONLINE = ON para que la transacción DROP INDEX no bloquee las consultas y modificaciones en los datos subyacentes y en los índices no agrupados asociados.When you drop a clustered index, specify the ONLINE = ON option so the DROP INDEX transaction doesn't block queries and modifications to the underlying data and associated nonclustered indexes.

ONLINE = ON tiene las siguientes restricciones:ONLINE = ON has the following restrictions:

  • ONLINE = ON no es válido para índices agrupados que también estén deshabilitados.ONLINE = ON isn't valid for clustered indexes that are also disabled. Los índices deshabilitados deben quitarse con ONLINE = OFF.Disabled indexes must be dropped by using ONLINE = OFF.
  • Solo un índice puede quitarse cada vez.Only one index at a time can be dropped.
  • ONLINE = ON no es válido para las vistas indizadas, índices no agrupados ni índices de tablas temporales locales.ONLINE = ON isn't valid for indexed views, nonclustered indexes, or indexes on local temp tables.
  • ONLINE = ON no es válido para los índices de almacén de columnas.ONLINE = ON isn't valid for columnstore indexes.

Para quitar un índice clúster, se necesita un espacio temporal en disco del mismo tamaño que el del índice clúster existente.Temporary disk space equal to the size of the existing clustered index is required to drop a clustered index. Este espacio adicional se libera en cuanto se completa la operación.This additional space is released as soon as the operation is completed.

Nota

Las opciones que aparecen con <drop_clustered_constraint_option> se aplican a índices agrupados en tablas y no se pueden aplicar a índices agrupados en vistas o índices no agrupados.The options listed under <drop_clustered_constraint_option> apply to clustered indexes on tables and can't be applied to clustered indexes on views or nonclustered indexes.

Replicar cambios de esquemaReplicating Schema Changes

De forma predeterminada, cuando se ejecuta ALTER TABLE en una tabla publicada en un publicador de SQL ServerSQL Server, el cambio se propaga a todos los suscriptores de SQL ServerSQL Server.When you run ALTER TABLE on a published table at a SQL ServerSQL Server Publisher, by default, that change propagates to all SQL ServerSQL Server Subscribers. Esta funcionalidad tiene algunas restricciones.This functionality has some restrictions. La puede deshabilitar.You can disable it. Para más información, vea Realizar cambios de esquema en bases de datos de publicaciones.For more information, see Make Schema Changes on Publication Databases.

Data CompressionData Compression

En las tablas del sistema no se puede habilitar la compresión.System tables can't be enabled for compression. Si la tabla es un montón, la operación de regeneración en modo ONLINE será de un solo subproceso.If the table is a heap, the rebuild operation for ONLINE mode will be single threaded. Utilice el modo OFFLINE para una operación de regeneración de montón de varios subprocesos.Use OFFLINE mode for a multi-threaded heap rebuild operation. Para obtener más información sobre la compresión de datos, vea Compresión de datos.For a more information about data compression, seeData Compression.

Para evaluar cómo afecta el cambio del estado de compresión a una tabla, índice o partición, use el procedimiento almacenado sp_estimate_data_compression_savings .To evaluate how changing the compression state will affect a table, an index, or a partition, use the sp_estimate_data_compression_savings stored procedure.

Las restricciones siguientes se aplican a las tablas con particiones:The following restrictions apply to partitioned tables:

  • No se puede cambiar la configuración de compresión de una partición única si la tabla tiene índices no alineados.You can't change the compression setting of a single partition if the table has nonaligned indexes.
  • La sintaxis ALTER TABLE <tabla> REBUILD PARTITION ... vuelve a recompilar la partición especificada.The ALTER TABLE <table> REBUILD PARTITION ... syntax rebuilds the specified partition.
  • La sintaxis ALTER TABLE <tabla> REBUILD WITH... vuelve a recompilar todas las particiones.The ALTER TABLE <table> REBUILD WITH ... syntax rebuilds all partitions.

Quitar columnas NTEXTDropping NTEXT Columns

Al quitar las columnas NTEXT, la limpieza de los datos eliminados se produce como una operación serializada en todas las filas.When dropping NTEXT columns, the cleanup of the deleted data occurs as a serialized operation on all rows. La limpieza puede requerir una gran cantidad de tiempo.The cleanup can require a large amount of time. Al quitar una columna NTEXT de una tabla con un gran número de filas, actualice la columna NTEXT con el valor NULL en primer lugar y luego quite la columna.When dropping an NTEXT column in a table with lots of rows, update the NTEXT column to NULL value first, then drop the column. Puede ejecutar esta opción con operaciones en paralelo para que sea mucho más rápida.You can run this option with parallel operations and make it much faster.

Volver a generar índice en líneaOnline Index Rebuild

Para ejecutar la instrucción DDL a fin de regenerar el índice en línea, todas las transacciones activas de bloqueo que se ejecutan en una tabla determinada deben completarse.To run the DDL statement for an online index rebuild, all active blocking transactions running on a particular table must be completed. Cuando la regeneración de índice en línea se inicia, bloquea todas las nuevas transacciones que están listas para iniciar la ejecución en esta tabla.When the online index rebuild launches, it blocks all new transactions that are ready to start running on this table. Aunque la vigencia del bloqueo para volver a generar el índice en línea es muy corta, si se espera a que las transacciones abiertas en una tabla dada se completen y se bloquean las nuevas transacciones que se inician, se podría afectar significativamente al rendimiento.Although the duration of the lock for online index rebuild is short, waiting for all open transactions on a given table to complete and blocking the new transactions to start, might significantly affect the throughput. Esto puede provocar un retraso o un tiempo de espera en la carga de trabajo y limitar mucho el acceso a la tabla base.This can cause a workload slow-down or timeout and significantly limit access to the underlying table. Con la opción WAIT_AT_LOW_PRIORITY, el DBA puede administrar los bloqueos S-lock y Sch-M necesarios para las regeneraciones de índice en línea y seleccionar una de las tres opciones.The WAIT_AT_LOW_PRIORITY option allows DBAs to manage the S-lock and Sch-M locks required for online index rebuilds and lets them to select one of three options. En los tres casos, si durante el tiempo de espera ((MAX_DURATION =n [minutes])) no hay actividades de bloqueo, la regeneración de índice en línea se ejecuta inmediatamente sin esperar y la instrucción DDL se completa.In all three cases, if during the wait time ( (MAX_DURATION =n [minutes]) ) there are no blocking activities, the online index rebuild is run immediately without waiting and the DDL statement is completed.

Soporte de compatibilidadCompatibility Support

La instrucción ALTER TABLE solo permite nombres de tabla de dos partes (esquema.objeto).The ALTER TABLE statement supports only two-part (schema.object) table names. En SQL Server 2017SQL Server 2017, la especificación de un nombre de tabla con uno de los siguientes formatos produce el error 117 en tiempo de compilación.In SQL Server 2017SQL Server 2017, specifying a table name using the following formats fails at compile time with error 117.

  • servidor.baseDeDatos.esquema.tablaserver.database.schema.table
  • .baseDeDatos.esquema.tabla.database.schema.table
  • ..esquema.tabla..schema.table

En versiones anteriores, al especificar el formato servidor.baseDeDatos.esquema.tabla se devolvía el error 4902.In earlier versions, specifying the format server.database.schema.table returned error 4902. La especificación del formato .baseDeDatos.esquema.tabla o ..esquema.tabla se realizaba correctamente.Specifying the format .database.schema.table or the format ..schema.table succeeded.

Para resolver el problema, quite el uso de un prefijo de cuatro partes.To resolve the problem, remove the use of a four-part prefix.

PermisosPermissions

Requiere el permiso ALTER en la tabla.Requires ALTER permission on the table.

Los permisos ALTER TABLE se aplican a las tablas relacionadas con una instrucción ALTER TABLE SWITCH.ALTER TABLE permissions apply to both tables involved in an ALTER TABLE SWITCH statement. Los datos que se modifican heredan la seguridad de la tabla de destino.Any data that's switched inherits the security of the target table.

Si ha definido alguna columna de la instrucción ALTER TABLE para que sea un tipo definido por el usuario de CLR (Common Language Runtime) o un tipo de datos del alias, se necesita el permiso REFERENCES sobre el tipo.If you've defined any columns in the ALTER TABLE statement to be of a common language runtime (CLR) user-defined type or alias data type, REFERENCES permission on the type is required.

La adición de una columna que actualiza las filas de la tabla requiere el permiso UPDATE en ella.Adding a column that updates the rows of the table requires UPDATE permission on the table. Por ejemplo, agregar una columna NOT NULL con un valor predeterminado o agregar una columna de identidad si la tabla no está vacía.For example, adding a NOT NULL column with a default value or adding an identity column when the table isn't empty.

EjemplosExamples

CategoríaCategory Elementos de sintaxis ofrecidosFeatured syntax elements
Agregar columnas y restriccionesAdding columns and constraints ADD • PRIMARY KEY con opciones de índice • columnas dispersas y conjuntos de columnas •ADD • PRIMARY KEY with index options • sparse columns and column sets •
Quitar columnas y restriccionesDropping columns and constraints DROPDROP
Modificar una definición de columnaAltering a column definition cambiar tipo de datos • cambiar tamaño de columna • intercalaciónchange data type • change column size • collation
Modificar una definición de tablaAltering a table definition DATA_COMPRESSION • SWITCH PARTITION • LOCK ESCALATION • seguimiento de cambiosDATA_COMPRESSION • SWITCH PARTITION • LOCK ESCALATION • change tracking
Deshabilitar y habilitar restricciones y desencadenadoresDisabling and enabling constraints and triggers CHECK • NO CHECK • ENABLE TRIGGER • DISABLE TRIGGERCHECK • NO CHECK • ENABLE TRIGGER • DISABLE TRIGGER
   

Agregar columnas y restriccionesAdding Columns and Constraints

En los ejemplos de esta sección se muestra cómo agregar columnas y restricciones a una tabla.Examples in this section demonstrate adding columns and constraints to a table.

A.A. Agregar una columna nuevaAdding a new column

En el ejemplo siguiente se agrega una columna que permite valores NULL y a la que no se han proporcionado valores mediante una definición DEFAULT.The following example adds a column that allows null values and has no values provided through a DEFAULT definition. En la nueva columna, cada fila tendrá valores NULL.In the new column, each row will have NULL.

CREATE TABLE dbo.doc_exa (column_a INT) ;
GO
ALTER TABLE dbo.doc_exa ADD column_b VARCHAR(20) NULL ;
GO

B.B. Agregar una columna con una restricciónAdding a column with a constraint

En el ejemplo siguiente se agrega una nueva columna con una restricción UNIQUE.The following example adds a new column with a UNIQUE constraint.

CREATE TABLE dbo.doc_exc (column_a INT) ;
GO
ALTER TABLE dbo.doc_exc ADD column_b VARCHAR(20) NULL
    CONSTRAINT exb_unique UNIQUE ;
GO
EXEC sp_help doc_exc ;
GO
DROP TABLE dbo.doc_exc ;
GO

C.C. Agregar una restricción CHECK no comprobada a una columna existenteAdding an unverified CHECK constraint to an existing column

En el ejemplo siguiente se agrega una restricción a una columna existente de la tabla.The following example adds a constraint to an existing column in the table. La columna tiene un valor que infringe la restricción.The column has a value that violates the constraint. Por tanto, WITH NOCHECK se usa para evitar que la restricción se valide en las filas existentes y para poder agregar la restricción.Therefore, WITH NOCHECK is used to prevent the constraint from being validated against existing rows, and to allow for the constraint to be added.

CREATE TABLE dbo.doc_exd ( column_a INT) ;
GO
INSERT INTO dbo.doc_exd VALUES (-1) ;
GO
ALTER TABLE dbo.doc_exd WITH NOCHECK
ADD CONSTRAINT exd_check CHECK (column_a > 1) ;
GO
EXEC sp_help doc_exd ;
GO
DROP TABLE dbo.doc_exd ;
GO

D.D. Agregar una restricción DEFAULT a una columna existenteAdding a DEFAULT constraint to an existing column

En el ejemplo siguiente se crea una tabla con dos columnas y se inserta un valor en la primera columna, y la otra columna sigue siendo NULL.The following example creates a table with two columns and inserts a value into the first column, and the other column remains NULL. A continuación se agrega una restricción DEFAULT a la segunda columna.A DEFAULT constraint is then added to the second column. Para comprobar que se aplica el valor predeterminado, se inserta otro valor en la primera columna y se consulta la tabla.To verify that the default is applied, another value is inserted into the first column, and the table is queried.

CREATE TABLE dbo.doc_exz ( column_a INT, column_b INT) ;
GO
INSERT INTO dbo.doc_exz (column_a)VALUES ( 7 ) ;
GO
ALTER TABLE dbo.doc_exz
  ADD CONSTRAINT col_b_def
  DEFAULT 50 FOR column_b ;
GO
INSERT INTO dbo.doc_exz (column_a) VALUES ( 10 ) ;
GO
SELECT * FROM dbo.doc_exz ;
GO
DROP TABLE dbo.doc_exz ;
GO

E.E. Agregar varias columnas con restriccionesAdding several columns with constraints

En el ejemplo siguiente se agregan varias columnas con restricciones que se definen con la nueva columna.The following example adds several columns with constraints defined with the new column. La primera columna nueva tiene una propiedad IDENTITY.The first new column has an IDENTITY property. Cada fila de la tabla tiene nuevos valores incrementales en la columna de identidad.Each row in the table has new incremental values in the identity column.

CREATE TABLE dbo.doc_exe ( column_a INT CONSTRAINT column_a_un UNIQUE) ;
GO
ALTER TABLE dbo.doc_exe ADD

-- Add a PRIMARY KEY identity column.
column_b INT IDENTITY
CONSTRAINT column_b_pk PRIMARY KEY,

-- Add a column that references another column in the same table.
column_c INT NULL
CONSTRAINT column_c_fk
REFERENCES doc_exe(column_a),

-- Add a column with a constraint to enforce that
-- nonnull data is in a valid telephone number format.
column_d VARCHAR(16) NULL
CONSTRAINT column_d_chk
CHECK
(column_d LIKE '[0-9][0-9][0-9]-[0-9][0-9][0-9][0-9]' OR
column_d LIKE
'([0-9][0-9][0-9]) [0-9][0-9][0-9]-[0-9][0-9][0-9][0-9]'),

-- Add a nonnull column with a default.
column_e DECIMAL(3,3)
CONSTRAINT column_e_default
DEFAULT .081 ;
GO
EXEC sp_help doc_exe ;
GO
DROP TABLE dbo.doc_exe ;
GO

F.F. Agregar una columna que admite valores NULL con valores predeterminadosAdding a nullable column with default values

En el ejemplo siguiente se agrega una columna que acepta valores NULL con una definición DEFAULT y se usa WITH VALUES para proporcionar valores para cada fila existente en la tabla.The following example adds a nullable column with a DEFAULT definition, and uses WITH VALUES to provide values for each existing row in the table. Si no se utiliza WITH VALUES, cada fila tiene el valor NULL en la nueva columna.If WITH VALUES isn't used, each row has the value NULL in the new column.

CREATE TABLE dbo.doc_exf ( column_a INT) ;
GO
INSERT INTO dbo.doc_exf VALUES (1) ;
GO
ALTER TABLE dbo.doc_exf
ADD AddDate smalldatetime NULL
CONSTRAINT AddDateDflt
DEFAULT GETDATE() WITH VALUES ;
GO
DROP TABLE dbo.doc_exf ;
GO

G.G. Creación de una restricción PRIMARY KEY con opciones de índice o compresión de datosCreating a PRIMARY KEY constraint with index or data compression options

En el ejemplo siguiente se crea la restricción PRIMARY KEY PK_TransactionHistoryArchive_TransactionID y se establecen las opciones FILLFACTOR, ONLINE y PAD_INDEX.The following example creates the PRIMARY KEY constraint PK_TransactionHistoryArchive_TransactionID and sets the options FILLFACTOR, ONLINE, and PAD_INDEX. El índice clúster resultante tendrá el mismo nombre que la restricción.The resulting clustered index will have the same name as the constraint.

Se aplica a: SQL Server 2008SQL Server 2008 a SQL Server 2017SQL Server 2017 y Base de datos SQL de AzureAzure SQL Database.Applies to: SQL Server 2008SQL Server 2008 through SQL Server 2017SQL Server 2017 and Base de datos SQL de AzureAzure SQL Database.

USE AdventureWorks;
GO
ALTER TABLE Production.TransactionHistoryArchive WITH NOCHECK
ADD CONSTRAINT PK_TransactionHistoryArchive_TransactionID PRIMARY KEY CLUSTERED (TransactionID)
WITH (FILLFACTOR = 75, ONLINE = ON, PAD_INDEX = ON);
GO

En este ejemplo similar se aplica la compresión de página mientras se aplica la clave principal agrupada.This similar example applies page compression while applying the clustered primary key.

USE AdventureWorks;
GO
ALTER TABLE Production.TransactionHistoryArchive WITH NOCHECK
ADD CONSTRAINT PK_TransactionHistoryArchive_TransactionID PRIMARY KEY CLUSTERED (TransactionID)
WITH (DATA_COMPRESSION = PAGE);
GO

H.H. Agregar una columna dispersaAdding a sparse column

En los ejemplos siguientes se muestra cómo agregar y modificar columnas dispersas en la tabla T1.The following examples show adding and modifying sparse columns in table T1. El código para crear la tabla T1 es el siguiente.The code to create table T1 is as follows.

CREATE TABLE T1
(C1 int PRIMARY KEY,
C2 varchar(50) SPARSE NULL,
C3 int SPARSE NULL,
C4 int ) ;
GO

Para agregar una columna dispersa adicional C5, ejecute la instrucción siguiente.To add an additional sparse column C5, execute the following statement.

ALTER TABLE T1
ADD C5 char(100) SPARSE NULL ;
GO

Para convertir la columna no dispersa C4 en una columna dispersa, ejecute la instrucción siguiente.To convert the C4 non-sparse column to a sparse column, execute the following statement.

ALTER TABLE T1
ALTER COLUMN C4 ADD SPARSE ;
GO

Para convertir la columna dispersa C4 en una columna no dispersa, ejecute la instrucción siguiente.To convert the C4 sparse column to a nonsparse column, execute the following statement.

ALTER TABLE T1
ALTER COLUMN C4 DROP SPARSE;
GO

I.I. Agregar un conjunto de columnasAdding a column set

En los ejemplos siguientes se muestra cómo agregar una columna a la tabla T2.The following examples show adding a column to table T2. No se puede agregar un conjunto de columnas a una tabla si esta ya contiene columnas dispersas.A column set can't be added to a table that already contains sparse columns. El código para crear la tabla T2 es el siguiente.The code to create table T2 is as follows.

CREATE TABLE T2
(C1 int PRIMARY KEY,
C2 varchar(50) NULL,
C3 int NULL,
C4 int ) ;
GO

Las tres instrucciones siguientes agregan un conjunto de columnas denominado CS y, a continuación, modifican las columnas C2 y C3 a SPARSE.The following three statements add a column set named CS, and then modify columns C2 and C3 to SPARSE.

ALTER TABLE T2
ADD CS XML COLUMN_SET FOR ALL_SPARSE_COLUMNS ;
GO

ALTER TABLE T2
ALTER COLUMN C2 ADD SPARSE ;
GO

ALTER TABLE T2
ALTER COLUMN C3 ADD SPARSE ;
GO

J.J. Agregar una columna cifradaAdding an encrypted column

La siguiente instrucción agrega una columna cifrada con el nombre PromotionCode.The following statement adds an encrypted column named PromotionCode.

ALTER TABLE Customers ADD
    PromotionCode nvarchar(100)
    ENCRYPTED WITH (COLUMN_ENCRYPTION_KEY = MyCEK,
    ENCRYPTION_TYPE = RANDOMIZED,
    ALGORITHM = 'AEAD_AES_256_CBC_HMAC_SHA_256') ;

Quitar columnas y restriccionesDropping Columns and Constraints

En los ejemplos de esta sección se muestra cómo quitar columnas y restricciones.The examples in this section demonstrate dropping columns and constraints.

A.A. Quitar una o varias columnasDropping a column or columns

En el primer ejemplo se modifica una tabla para quitar una columna.The first example modifies a table to remove a column. En el segundo ejemplo se quitan varias columnas.The second example removes multiple columns.

CREATE TABLE dbo.doc_exb
    (column_a INT
     ,column_b VARCHAR(20) NULL
     ,column_c datetime
     ,column_d int) ;
GO  
-- Remove a single column.
ALTER TABLE dbo.doc_exb DROP COLUMN column_b ;
GO
-- Remove multiple columns.
ALTER TABLE dbo.doc_exb DROP COLUMN column_c, column_d;

B.B. Quitar restricciones y columnasDropping constraints and columns

En el primer ejemplo se quita una restricción UNIQUE de una tabla.The first example removes a UNIQUE constraint from a table. En el segundo ejemplo se quitan dos restricciones y una sola columna.The second example removes two constraints and a single column.

CREATE TABLE dbo.doc_exc ( column_a int NOT NULL CONSTRAINT my_constraint UNIQUE) ;
GO

-- Example 1. Remove a single constraint.
ALTER TABLE dbo.doc_exc DROP my_constraint ;
GO

DROP TABLE dbo.doc_exc;
GO

CREATE TABLE dbo.doc_exc ( column_a int
                          NOT NULL CONSTRAINT my_constraint UNIQUE
                          ,column_b int
                          NOT NULL CONSTRAINT my_pk_constraint PRIMARY KEY) ;
GO

-- Example 2. Remove two constraints and one column
-- The keyword CONSTRAINT is optional. The keyword COLUMN is required.
ALTER TABLE dbo.doc_exc

    DROP CONSTRAINT my_constraint, my_pk_constraint, COLUMN column_b ;
GO

C.C. Quitar una restricción PRIMARY KEY en modo ONLINEDropping a PRIMARY KEY constraint in the ONLINE mode

En el ejemplo siguiente se elimina una restricción KEY PRIMARY con la opción ONLINE establecida en ON.The following example deletes a PRIMARY KEY constraint with the ONLINE option set to ON.

ALTER TABLE Production.TransactionHistoryArchive
DROP CONSTRAINT PK_TransactionHistoryArchive_TransactionID
WITH (ONLINE = ON);
GO

D.D. Agregar y quitar una restricción FOREIGN KEYAdding and dropping a FOREIGN KEY constraint

En el ejemplo siguiente se crea la tabla ContactBackup y, a continuación, se modifica la tabla; primero se agrega una restricción FOREIGN KEY que hace referencia a la tabla Person.Person y, a continuación, se quita la restricción FOREIGN KEY.The following example creates the table ContactBackup, and then alters the table, first by adding a FOREIGN KEY constraint that references the table Person.Person, then by dropping the FOREIGN KEY constraint.

CREATE TABLE Person.ContactBackup
    (ContactID int) ;
GO

ALTER TABLE Person.ContactBackup
ADD CONSTRAINT FK_ContactBackup_Contact FOREIGN KEY (ContactID)
    REFERENCES Person.Person (BusinessEntityID) ;
GO

ALTER TABLE Person.ContactBackup
DROP CONSTRAINT FK_ContactBackup_Contact ;
GO

DROP TABLE Person.ContactBackup ;

Icono de flecha usado con el vínculo Volver al principio EjemplosArrow icon used with Back to Top link Examples

Modificar una definición de columnaAltering a Column Definition

A.A. Cambiar el tipo de datos de una columnaChanging the data type of a column

En el ejemplo siguiente se modifica una columna de una tabla de INT a DECIMAL.The following example changes a column of a table from INT to DECIMAL.

CREATE TABLE dbo.doc_exy (column_a INT ) ;
GO
INSERT INTO dbo.doc_exy (column_a) VALUES (10) ;
GO
ALTER TABLE dbo.doc_exy ALTER COLUMN column_a DECIMAL (5, 2) ;
GO
DROP TABLE dbo.doc_exy ;
GO

B.B. Cambiar el tamaño de una columnaChanging the size of a column

En el ejemplo siguiente se aumenta el tamaño de una columna varchar y la precisión y la escala de una columna decimal.The following example increases the size of a varchar column and the precision and scale of a decimal column. Dado que las columnas contienen datos, solo se puede aumentar el tamaño de columna.Because the columns contain data, the column size can only be increased. Observe también que col_a se define en un índice único.Also notice that col_a is defined in a unique index. Aún se puede aumentar el tamaño de col_a porque el tipo de datos es varchar y el índice no es el resultado de una restricción KEY PRIMARY.The size of col_a can still be increased because the data type is a varchar and the index isn't the result of a PRIMARY KEY constraint.

-- Create a two-column table with a unique index on the varchar column.
CREATE TABLE dbo.doc_exy ( col_a varchar(5) UNIQUE NOT NULL, col_b decimal (4,2));
GO
INSERT INTO dbo.doc_exy VALUES ('Test', 99.99);
GO
-- Verify the current column size.
SELECT name, TYPE_NAME(system_type_id), max_length, precision, scale
FROM sys.columns WHERE object_id = OBJECT_ID(N'dbo.doc_exy');
GO
-- Increase the size of the varchar column.
ALTER TABLE dbo.doc_exy ALTER COLUMN col_a varchar(25);
GO
-- Increase the scale and precision of the decimal column.
ALTER TABLE dbo.doc_exy ALTER COLUMN col_b decimal (10,4);
GO
-- Insert a new row.
INSERT INTO dbo.doc_exy VALUES ('MyNewColumnSize', 99999.9999) ;
GO
-- Verify the current column size.
SELECT name, TYPE_NAME(system_type_id), max_length, precision, scale
FROM sys.columns WHERE object_id = OBJECT_ID(N'dbo.doc_exy');

C.C. Cambiar la intercalación de columnasChanging column collation

En el siguiente ejemplo se muestra cómo cambiar la intercalación de una columna.The following example shows how to change the collation of a column. Primero, se crea una tabla con la intercalación predeterminada del usuario.First, a table is created table with the default user collation.

CREATE TABLE T3
(C1 int PRIMARY KEY,
C2 varchar(50) NULL,
C3 int NULL,
C4 int ) ;
GO

Después, la intercalación de la columna C2 se cambia a Latin1_General_BIN.Next, column C2 collation is changed to Latin1_General_BIN. El tipo de datos se requiere, incluso aunque no se cambie.The data type is required, even though it isn't changed.

ALTER TABLE T3
ALTER COLUMN C2 varchar(50) COLLATE Latin1_General_BIN;
GO

D.D. Cifrado de una columnaEncrypting a column

El ejemplo siguiente muestra cómo cifrar una columna mediante Always Encrypted con enclaves seguros.The following example shows how to encrypt a column using Always Encrypted with secure enclaves.

En primer lugar, se crea una tabla sin columnas cifradas.First, a table is created without any encrypted columns.

CREATE TABLE T3
(C1 int PRIMARY KEY,
C2 varchar(50) NULL,
C3 int NULL,
C4 int ) ;
GO

Después, se cifra la columna "C2" con una clave de cifrado de columna, denominada CEK1, y cifrado aleatorio.Next, column 'C2' is encrypted with a column encryption key, named CEK1, and randomized encryption. Para que la siguiente instrucción se realice correctamente:For the following statement to succeed:

  • La clave de cifrado de la columna debe estar habilitada para el enclave.The column encryption key must be enclave-enabled. Esto significa que debe cifrarse con una clave maestra de columna que permita los cálculos de enclave.Meaning, it must be encrypted with a column master key that allows enclave computations.
  • La instancia de SQL Server de destino debe admitir Always Encrypted con enclaves seguros.The target SQL Server instance must support Always Encrypted with secure enclaves.
  • La instrucción debe emitirse a través de una conexión configurada para Always Encrypted con enclaves seguros y con un controlador cliente compatible.The statement must be issued over a connection set up for Always Encrypted with secure enclaves, and using a supported client driver.
  • La aplicación que realiza la llamada debe tener acceso a la clave maestra de columna que protege CEK1.The calling application must have access to the column master key, protecting CEK1.
ALTER TABLE T3
ALTER COLUMN C2 varchar(50) ENCRYPTED WITH (COLUMN_ENCRYPTION_KEY = [CEK1], ENCRYPTION_TYPE = Randomized, ALGORITHM = 'AEAD_AES_256_CBC_HMAC_SHA_256') NULL;
GO

Modificar una definición de tablaAltering a Table Definition

En los ejemplos de esta sección se muestra cómo modificar la definición de una tabla.The examples in this section demonstrate how to alter the definition of a table.

A.A. Modificar una tabla para cambiar la compresiónModifying a table to change the compression

En el ejemplo siguiente se cambia la compresión de una tabla sin particiones.The following example changes the compression of a nonpartitioned table. Se volverá a generar el montón o el índice clúster.The heap or clustered index will be rebuilt. Si la tabla es un montón, se volverán a generar todos los índices no clúster.If the table is a heap, all nonclustered indexes will be rebuilt.

ALTER TABLE T1
REBUILD WITH (DATA_COMPRESSION = PAGE);

En el ejemplo siguiente se cambia la compresión de una tabla con particiones.The following example changes the compression of a partitioned table. La sintaxis REBUILD PARTITION = 1 hace que solo se vuelva a generar la partición número 1.The REBUILD PARTITION = 1 syntax causes only partition number 1 to be rebuilt.

Se aplica a: SQL Server 2008SQL Server 2008 a SQL Server 2017SQL Server 2017 y Base de datos SQL de AzureAzure SQL Database.Applies to: SQL Server 2008SQL Server 2008 through SQL Server 2017SQL Server 2017 and Base de datos SQL de AzureAzure SQL Database.

ALTER TABLE PartitionTable1
REBUILD PARTITION = 1 WITH (DATA_COMPRESSION =NONE) ;
GO

La misma operación que utiliza la sintaxis alternativa siguiente hace que se vuelvan a generar todas las particiones de la tabla.The same operation using the following alternate syntax causes all partitions in the table to be rebuilt.

Se aplica a: SQL Server 2008SQL Server 2008 a SQL Server 2017SQL Server 2017 y Base de datos SQL de AzureAzure SQL Database.Applies to: SQL Server 2008SQL Server 2008 through SQL Server 2017SQL Server 2017 and Base de datos SQL de AzureAzure SQL Database.

ALTER TABLE PartitionTable1
REBUILD PARTITION = ALL
WITH (DATA_COMPRESSION = PAGE ON PARTITIONS(1) ) ;

Para obtener más ejemplos de compresión de datos, vea Compresión de datos.For additional data compression examples, see Data Compression.

B.B. Modificar una tabla de almacén de columnas para cambiar la compresión de archivoModifying a columnstore table to change archival compression

En el ejemplo siguiente se comprime aún más una partición de tabla de almacén de columnas aplicando un algoritmo de compresión adicional.The following example further compresses a columnstore table partition by applying an additional compression algorithm. Esta compresión reduce la tabla a un tamaño mínimo, pero también aumenta el tiempo necesario para el almacenamiento y la recuperación.This compression reduces the table to a smaller size, but also increases the time required for storage and retrieval. Esto resulta útil para el archivado o para otras situaciones que requieran menos espacio y en las que pueda permitirse más tiempo para el almacenamiento y recuperación.This is useful for archiving or for situations that require less space and can afford more time for storage and retrieval.

Se aplica a: SQL Server 2014 (12.x)SQL Server 2014 (12.x) a SQL Server 2017SQL Server 2017 y Base de datos SQL de AzureAzure SQL Database.Applies to: SQL Server 2014 (12.x)SQL Server 2014 (12.x) through SQL Server 2017SQL Server 2017 and Base de datos SQL de AzureAzure SQL Database.

ALTER TABLE PartitionTable1
REBUILD PARTITION = 1 WITH (DATA_COMPRESSION = COLUMNSTORE_ARCHIVE) ;
GO

En el siguiente ejemplo se descomprime una partición de tabla de almacén de columnas que se comprimió con la opción COLUMNSTORE_ARCHIVE.The following example decompresses a columnstore table partition that was compressed with COLUMNSTORE_ARCHIVE option. Cuando se restauran los datos, seguirán estando comprimidos con la compresión de almacén de columnas que se usa para todas las tablas de almacén de columnas.When the data is restored, it will continue to be compressed with the columnstore compression that's used for all columnstore tables.

Se aplica a: SQL Server 2014 (12.x)SQL Server 2014 (12.x) a SQL Server 2017SQL Server 2017 y Base de datos SQL de AzureAzure SQL Database.Applies to: SQL Server 2014 (12.x)SQL Server 2014 (12.x) through SQL Server 2017SQL Server 2017 and Base de datos SQL de AzureAzure SQL Database.

ALTER TABLE PartitionTable1
REBUILD PARTITION = 1 WITH (DATA_COMPRESSION =COLUMNSTORE) ;
GO

C.C. Cambiar las particiones entre tablasSwitching partitions between tables

En el ejemplo siguiente se crea una tabla con particiones, suponiendo que el esquema de partición myRangePS1 ya esté creado en la base de datos.The following example creates a partitioned table, assuming that partition scheme myRangePS1 is already created in the database. A continuación, se crea una tabla sin particiones con la misma estructura que la tabla con particiones y en el mismo grupo de archivos que PARTITION 2 de la tabla PartitionTable.Next, a non-partitioned table is created with the same structure as the partitioned table and on the same filegroup as PARTITION 2 of table PartitionTable. Los datos de PARTITION 2 de la tabla PartitionTable se cambian entonces a la tabla NonPartitionTable.The data of PARTITION 2 of table PartitionTable is then switched into table NonPartitionTable.

CREATE TABLE PartitionTable (col1 int, col2 char(10))
ON myRangePS1 (col1) ;
GO
CREATE TABLE NonPartitionTable (col1 int, col2 char(10))
ON test2fg ;
GO
ALTER TABLE PartitionTable SWITCH PARTITION 2 TO NonPartitionTable ;
GO

D.D. Permitir la extensión de bloqueo en tablas con particionesAllowing lock escalation on partitioned tables

En el ejemplo siguiente se habilita la extensión de bloqueo al nivel de partición en una tabla con particiones.The following example enables lock escalation to the partition level on a partitioned table. Si la tabla no tiene particiones, la extensión de bloqueo se establece en el nivel TABLE.If the table isn't partitioned, lock escalation is set at the TABLE level.

Se aplica a: SQL Server 2008SQL Server 2008 a SQL Server 2017SQL Server 2017 y Base de datos SQL de AzureAzure SQL Database.Applies to: SQL Server 2008SQL Server 2008 through SQL Server 2017SQL Server 2017 and Base de datos SQL de AzureAzure SQL Database.

ALTER TABLE dbo.T1 SET (LOCK_ESCALATION = AUTO);
GO

E.E. Configurar el seguimiento de cambios en una tablaConfiguring change tracking on a table

En el ejemplo siguiente se habilita el seguimiento de cambios en la tabla Person.Person.The following example enables change tracking on the Person.Person table.

Se aplica a: SQL Server 2008SQL Server 2008 a SQL Server 2017SQL Server 2017 y Base de datos SQL de AzureAzure SQL Database.Applies to: SQL Server 2008SQL Server 2008 through SQL Server 2017SQL Server 2017 and Base de datos SQL de AzureAzure SQL Database.

USE AdventureWorks;
ALTER TABLE Person.Person
ENABLE CHANGE_TRACKING;

El ejemplo siguiente habilita el seguimiento de cambios y el seguimiento de las columnas que se actualizan durante un cambio.The following example enables change tracking and enables the tracking of the columns that are updated during a change.

Se aplica a: desde SQL Server 2008SQL Server 2008 hasta SQL Server 2017SQL Server 2017.Applies to: SQL Server 2008SQL Server 2008 through SQL Server 2017SQL Server 2017.

USE AdventureWorks;
GO
ALTER TABLE Person.Person
ENABLE CHANGE_TRACKING
WITH (TRACK_COLUMNS_UPDATED = ON)

En el ejemplo siguiente se deshabilita el seguimiento de cambios en la tabla Person.Person.The following example disables change tracking on the Person.Person table.

Se aplica a: SQL Server 2008SQL Server 2008 a SQL Server 2017SQL Server 2017 y Base de datos SQL de AzureAzure SQL Database.Applies to: SQL Server 2008SQL Server 2008 through SQL Server 2017SQL Server 2017 and Base de datos SQL de AzureAzure SQL Database.

USE AdventureWorks;
Go
ALTER TABLE Person.Person
DISABLE CHANGE_TRACKING;

Deshabilitar y habilitar restricciones y desencadenadoresDisabling and Enabling Constraints and Triggers

A.A. Deshabilitar y volver a habilitar una restricciónDisabling and re-enabling a constraint

En el ejemplo siguiente se deshabilita una restricción que limita los salarios aceptados en los datos.The following example disables a constraint that limits the salaries accepted in the data. NOCHECK CONSTRAINT se usa con ALTER TABLE para deshabilitar la restricción y permitir una inserción que normalmente infringiría la restricción.NOCHECK CONSTRAINT is used with ALTER TABLE to disable the constraint and allow for an insert that would typically violate the constraint. CHECK CONSTRAINT vuelve a habilitar la restricción.CHECK CONSTRAINT re-enables the constraint.

CREATE TABLE dbo.cnst_example
(id INT NOT NULL,
 name VARCHAR(10) NOT NULL,
 salary MONEY NOT NULL
    CONSTRAINT salary_cap CHECK (salary < 100000)
);

-- Valid inserts
INSERT INTO dbo.cnst_example VALUES (1,'Joe Brown',65000);
INSERT INTO dbo.cnst_example VALUES (2,'Mary Smith',75000);

-- This insert violates the constraint.
INSERT INTO dbo.cnst_example VALUES (3,'Pat Jones',105000);

-- Disable the constraint and try again.
ALTER TABLE dbo.cnst_example NOCHECK CONSTRAINT salary_cap;
INSERT INTO dbo.cnst_example VALUES (3,'Pat Jones',105000);

-- Re-enable the constraint and try another insert; this will fail.
ALTER TABLE dbo.cnst_example CHECK CONSTRAINT salary_cap;
INSERT INTO dbo.cnst_example VALUES (4,'Eric James',110000) ;

B.B. Deshabilitar y volver a habilitar un desencadenadorDisabling and re-enabling a trigger

En el ejemplo siguiente se usa la opción DISABLE TRIGGER de ALTER TABLE para deshabilitar el desencadenador y permitir una inserción que normalmente infringiría el desencadenador.The following example uses the DISABLE TRIGGER option of ALTER TABLE to disable the trigger and allow for an insert that would typically violate the trigger. Después se usa ENABLE TRIGGER para volver a habilitar el desencadenador.ENABLE TRIGGER is then used to re-enable the trigger.

CREATE TABLE dbo.trig_example
(id INT,
name VARCHAR(12),
salary MONEY) ;
GO
-- Create the trigger.
CREATE TRIGGER dbo.trig1 ON dbo.trig_example FOR INSERT
AS
IF (SELECT COUNT(*) FROM INSERTED
WHERE salary > 100000) > 0
BEGIN
    print 'TRIG1 Error: you attempted to insert a salary > $100,000'
    ROLLBACK TRANSACTION
END ;
GO
-- Try an insert that violates the trigger.
INSERT INTO dbo.trig_example VALUES (1,'Pat Smith',100001) ;
GO
-- Disable the trigger.
ALTER TABLE dbo.trig_example DISABLE TRIGGER trig1 ;
GO
-- Try an insert that would typically violate the trigger.
INSERT INTO dbo.trig_example VALUES (2,'Chuck Jones',100001) ;
GO
-- Re-enable the trigger.
ALTER TABLE dbo.trig_example ENABLE TRIGGER trig1 ;
GO
-- Try an insert that violates the trigger.
INSERT INTO dbo.trig_example VALUES (3,'Mary Booth',100001) ;
GO

Operaciones en líneaOnline Operations

A.A. Volver a generar el índice en línea mediante opciones de espera de prioridad bajaOnline index rebuild using low-priority wait options

En el ejemplo siguiente se muestra cómo realizar una regeneración de índice en línea que especifica las opciones de espera de prioridad baja.The following example shows how to perform an online index rebuild specifying the low-priority wait options.

Se aplica a: SQL Server 2014 (12.x)SQL Server 2014 (12.x) a SQL Server 2017SQL Server 2017 y Base de datos SQL de AzureAzure SQL Database.Applies to: SQL Server 2014 (12.x)SQL Server 2014 (12.x) through SQL Server 2017SQL Server 2017 and Base de datos SQL de AzureAzure SQL Database.

ALTER TABLE T1
REBUILD WITH
(
    PAD_INDEX = ON,
    ONLINE = ON ( WAIT_AT_LOW_PRIORITY ( MAX_DURATION = 4 MINUTES,
                                         ABORT_AFTER_WAIT = BLOCKERS ) )
)
;

B.B. Alteración de columna en líneaOnline Alter Column

En el ejemplo siguiente se muestra cómo ejecutar una operación de alteración de columna con la opción ONLINE.The following example shows how to run an alter column operation with the ONLINE option.

Se aplica a: SQL Server 2016 (13.x)SQL Server 2016 (13.x) a SQL Server 2017SQL Server 2017 y Base de datos SQL de AzureAzure SQL Database.Applies to: SQL Server 2016 (13.x)SQL Server 2016 (13.x) through SQL Server 2017SQL Server 2017 and Base de datos SQL de AzureAzure SQL Database.

CREATE TABLE dbo.doc_exy (column_a INT ) ;
GO
INSERT INTO dbo.doc_exy (column_a) VALUES (10) ;
GO
ALTER TABLE dbo.doc_exy
    ALTER COLUMN column_a DECIMAL (5, 2) WITH (ONLINE = ON);
GO
sp_help doc_exy;
DROP TABLE dbo.doc_exy ;
GO

Control de versiones del sistemaSystem Versioning

Los cuatro ejemplos siguientes le ayudarán a familiarizarse con la sintaxis para usar el control de versiones del sistema.The following four examples will help you become familiar with the syntax for using system versioning. Para obtener más ayuda, consulte Introducción a las tablas temporales con versión del sistema.For additional assistance, see Getting Started with System-Versioned Temporal Tables.

Se aplica a: SQL Server 2016 (13.x)SQL Server 2016 (13.x) a SQL Server 2017SQL Server 2017 y Base de datos SQL de AzureAzure SQL Database.Applies to: SQL Server 2016 (13.x)SQL Server 2016 (13.x) through SQL Server 2017SQL Server 2017 and Base de datos SQL de AzureAzure SQL Database.

A.A. Agregar el control de versiones del sistema a las tablas existentesAdd System Versioning to Existing Tables

En el ejemplo siguiente se muestra cómo agregar el control de versiones del sistema a una tabla existente y cómo crear una futura tabla de historial.The following example shows how to add system versioning to an existing table and create a future history table. En este ejemplo se supone que hay una tabla existente denominada InsurancePolicy con una clave principal definida.This example assumes that there's an existing table called InsurancePolicy with a primary key defined. En este ejemplo se rellenan las columnas de período recién creadas para las versiones de sistema utilizando los valores predeterminados para los tiempos de inicio y finalización porque estos valores no pueden ser null.This example populates the newly created period columns for system versioning using default values for the start and end times because these values can't be null. En este ejemplo se utiliza la cláusula HIDDEN para garantizar que las aplicaciones existentes que interactúan con la tabla actual no se vean afectadas.This example uses the HIDDEN clause to ensure no impact on existing applications interacting with the current table. También se usa HISTORY_RETENTION_PERIOD, que solo está disponible en SQL DatabaseSQL Database.It also uses HISTORY_RETENTION_PERIOD that's available on SQL DatabaseSQL Database only.

--Alter non-temporal table to define periods for system versioning
ALTER TABLE InsurancePolicy
ADD PERIOD FOR SYSTEM_TIME (SysStartTime, SysEndTime),
SysStartTime datetime2 GENERATED ALWAYS AS ROW START HIDDEN NOT NULL
    DEFAULT SYSUTCDATETIME(),
SysEndTime datetime2 GENERATED ALWAYS AS ROW END HIDDEN NOT NULL
    DEFAULT CONVERT(DATETIME2, '9999-12-31 23:59:59.99999999');

--Enable system versioning with 1 year retention for historical data
ALTER TABLE InsurancePolicy
SET (SYSTEM_VERSIONING = ON (HISTORY_RETENTION_PERIOD = 1 YEAR));

B.B. Migrar una solución existente para usar el control de versiones del sistemaMigrate An Existing Solution to Use System Versioning

En el ejemplo siguiente se muestra cómo migrar a las versiones del sistema desde una solución que utilice desencadenadores para imitar una compatibilidad temporal.The following example shows how to migrate to system versioning from a solution that uses triggers to mimic temporal support. En el ejemplo se da por supuesto que hay una solución existente en la que se usa una tabla ProjectTask y una tabla ProjectTaskHistory para su solución existente, que usa las columnas Changed Date y Revised Date para sus períodos, que estas columnas de período no usan el tipo de datos datetime2 y que la tabla ProjectTask tiene definida una clave principal.The example assumes there's an existing solution that uses a ProjectTask table and a ProjectTaskHistory table for its existing solution, that's uses the Changed Date and Revised Date columns for its periods, that these period columns don't use the datetime2 datatype and that the ProjectTask table has a primary key defined.

-- Drop existing trigger
DROP TRIGGER ProjectTask_HistoryTrigger;

-- Adjust the schema for current and history table
-- Change data types for existing period columns
ALTER TABLE ProjectTask ALTER COLUMN [Changed Date] datetime2 NOT NULL;
ALTER TABLE ProjectTask ALTER COLUMN [Revised Date] datetime2 NOT NULL;
ALTER TABLE ProjectTaskHistory ALTER COLUMN [Changed Date] datetime2 NOT NULL;
ALTER TABLE ProjectTaskHistory ALTER COLUMN [Revised Date] datetime2 NOT NULL;

-- Add SYSTEM_TIME period and set system versioning with linking two existing tables
-- (a certain set of data checks happen in the background)
ALTER TABLE ProjectTask
ADD PERIOD FOR SYSTEM_TIME ([Changed Date], [Revised Date])

ALTER TABLE ProjectTask
SET (SYSTEM_VERSIONING = ON (HISTORY_TABLE = dbo.ProjectTaskHistory, DATA_CONSISTENCY_CHECK = ON))

C.C. Deshabilitar y volver a habilitar el control de versiones del sistema para cambiar el esquema de la tabla de cambiosDisabling and Re-Enabling System Versioning to Change Table Schema

En este ejemplo se muestra cómo deshabilitar el control de versiones del sistema en la tabla Department, agregar una columna y volver a habilitar el control de versiones del sistema.This example shows how to disable system versioning on the Department table, add a column, and re-enable system versioning. Es necesario deshabilitar el control de versiones del sistema para modificar el esquema de la tabla.Disabling system versioning is required to modify the table schema. Siga estos pasos en una transacción para impedir las actualizaciones de ambas tablas al mismo tiempo que se actualiza el esquema de tabla, que permite que el DBA omita la comprobación de coherencia de los datos al volver a habilitar el control de versiones del sistema y obtener una ventaja de rendimiento.Do these steps within a transaction to prevent updates to both tables while updating the table schema, which enables the DBA to skip the data consistency check when re-enabling system versioning and gain a performance benefit. Tareas como la creación de estadísticas, la conmutación de particiones o la aplicación de la compresión en una o ambas tablas no requieren la deshabilitación del control de versiones del sistema.Tasks such as creating statistics, switching partitions, or applying compression to one or both tables doesn't require disabling system versioning.

BEGIN TRAN
/* Takes schema lock on both tables */
ALTER TABLE Department
    SET (SYSTEM_VERSIONING = OFF);
/* expand table schema for temporal table */
ALTER TABLE Department  
     ADD Col5 int NOT NULL DEFAULT 0;
/* Expand table schema for history table */
ALTER TABLE DepartmentHistory
    ADD Col5 int NOT NULL DEFAULT 0;
/* Re-establish versioning again*/
ALTER TABLE Department
    SET (SYSTEM_VERSIONING = ON (HISTORY_TABLE=dbo.DepartmentHistory,
                                 DATA_CONSISTENCY_CHECK = OFF));
COMMIT

D.D. Quitar el control de versiones del sistemaRemoving System Versioning

En este ejemplo se muestra cómo quitar completamente el control de versiones del sistema de la tabla del departamento y cómo quitar la tabla DepartmentHistory.This example shows how to completely remove system versioning from the Department table and drop the DepartmentHistory table. Si lo desea, también puede quitar las columnas de período utilizadas por el sistema para registrar información de versiones del sistema.Optionally, you might also want to drop the period columns used by the system to record system versioning information. No se puede quitar la tabla Department ni DepartmentHistory mientras el control de versiones del sistema esté habilitado.You can't drop either the Department or the DepartmentHistory tables while system versioning is enabled.

ALTER TABLE Department
    SET (SYSTEM_VERSIONING = OFF);
ALTER TABLE Department
DROP PERIOD FOR SYSTEM_TIME;
DROP TABLE DepartmentHistory;

Ejemplos: Almacenamiento de datos SQL de AzureAzure SQL Data Warehouse y Almacenamiento de datos paralelosParallel Data WarehouseExamples: Almacenamiento de datos SQL de AzureAzure SQL Data Warehouse and Almacenamiento de datos paralelosParallel Data Warehouse

En todos los ejemplos siguientes, del A al C, se usa la tabla FactResellerSales de la base de datos AdventureWorksPDW2012AdventureWorksPDW2012.The following examples A through C use the FactResellerSales table in the AdventureWorksPDW2012AdventureWorksPDW2012 database.

A.A. Determinar si se crean particiones de una tablaDetermining if a table is partitioned

La consulta siguiente devuelve una o más filas si la tabla tiene particiones FactResellerSales .The following query returns one or more rows if the table FactResellerSales is partitioned. Si la tabla no tiene particiones, no se devuelve ninguna fila.If the table isn't partitioned, no rows are returned.

SELECT * FROM sys.partitions AS p
JOIN sys.tables AS t
    ON p.object_id = t.object_id
WHERE p.partition_id IS NOT NULL
    AND t.name = 'FactResellerSales';

B.B. Determinar los valores de límite para una tabla con particionesDetermining boundary values for a partitioned table

La consulta siguiente devuelve los valores de límite para cada partición de la tabla FactResellerSales .The following query returns the boundary values for each partition in the FactResellerSales table.

SELECT t.name AS TableName, i.name AS IndexName, p.partition_number,
    p.partition_id, i.data_space_id, f.function_id, f.type_desc,
    r.boundary_id, r.value AS BoundaryValue
FROM sys.tables AS t
JOIN sys.indexes AS i
    ON t.object_id = i.object_id
JOIN sys.partitions AS p
    ON i.object_id = p.object_id AND i.index_id = p.index_id
JOIN  sys.partition_schemes AS s
    ON i.data_space_id = s.data_space_id
JOIN sys.partition_functions AS f
    ON s.function_id = f.function_id
LEFT JOIN sys.partition_range_values AS r
    ON f.function_id = r.function_id and r.boundary_id = p.partition_number
WHERE t.name = 'FactResellerSales' AND i.type <= 1
ORDER BY p.partition_number;

C.C. Determinar la columna de partición de una tabla con particionesDetermining the partition column for a partitioned table

La consulta siguiente devuelve el nombre de la columna de partición de la tabla.The following query returns the name of the partitioning column for table. Columnas en la tabla de origen capturadasFactResellerSalesFactResellerSales.

SELECT t.object_id AS Object_ID, t.name AS TableName,
    ic.column_id as PartitioningColumnID, c.name AS PartitioningColumnName
FROM sys.tables AS t
JOIN sys.indexes AS i
    ON t.object_id = i.object_id
JOIN sys.columns AS c
    ON t.object_id = c.object_id
JOIN sys.partition_schemes AS ps
    ON ps.data_space_id = i.data_space_id
JOIN sys.index_columns AS ic
    ON ic.object_id = i.object_id
    AND ic.index_id = i.index_id AND ic.partition_ordinal > 0
WHERE t.name = 'FactResellerSales'
AND i.type <= 1
AND c.column_id = ic.column_id;

D.D. Combinar dos particionesMerging two partitions

En el ejemplo siguiente se combinan dos particiones en una tabla.The following example merges two partitions on a table.

La tabla Customer tiene la definición siguiente:The Customer table has the following definition:

CREATE TABLE Customer (
    id int NOT NULL,
    lastName varchar(20),
    orderCount int,
    orderDate date)
WITH
    ( DISTRIBUTION = HASH(id),
    PARTITION ( orderCount RANGE LEFT
    FOR VALUES (1, 5, 10, 25, 50, 100)));

El comando siguiente combina los límites de partición 10 y 25.The following command combines the 10 and 25 partition boundaries.

ALTER TABLE Customer MERGE RANGE (10);

El nuevo archivo DDL para la tabla es:The new DDL for the table is:

CREATE TABLE Customer (
    id int NOT NULL,
    lastName varchar(20),
    orderCount int,
    orderDate date)
WITH
    ( DISTRIBUTION = HASH(id),
    PARTITION ( orderCount RANGE LEFT
    FOR VALUES (1, 5, 25, 50, 100)));

E.E. Dividir una particiónSplitting a partition

En el ejemplo siguiente se divide una partición de una tabla.The following example splits a partition on a table.

La tabla Customer tiene el siguiente archivo DDL:The Customer table has the following DDL:

DROP TABLE Customer;

CREATE TABLE Customer (
    id int NOT NULL,
    lastName varchar(20),
    orderCount int,
    orderDate date)
WITH
    ( DISTRIBUTION = HASH(id),
    PARTITION ( orderCount RANGE LEFT
    FOR VALUES (1, 5, 10, 25, 50, 100 )));

El siguiente comando crea un nuevo límite de partición por el valor 75, entre 50 y 100.The following command creates a new partition bound by the value 75, between 50 and 100.

ALTER TABLE Customer SPLIT RANGE (75);

El nuevo archivo DDL para la tabla es:The new DDL for the table is:

CREATE TABLE Customer (
   id int NOT NULL,
   lastName varchar(20),
   orderCount int,
   orderDate date)
   WITH DISTRIBUTION = HASH(id),
   PARTITION ( orderCount (RANGE LEFT
      FOR VALUES (1, 5, 10, 25, 50, 75, 100 )));

F.F. Usar SWITCH para mover una partición a una tabla de historialUsing SWITCH to move a partition to a history table

En el siguiente ejemplo se mueven los datos de una partición de la tabla Orders a una partición de la tabla OrdersHistory.The following example moves the data in a partition of the Orders table to a partition in the OrdersHistory table.

La tabla Orders tiene el siguiente archivo DDL:The Orders table has the following DDL:

CREATE TABLE Orders (
    id INT,
    city VARCHAR (25),
    lastUpdateDate DATE,
    orderDate DATE )
WITH
    (DISTRIBUTION = HASH ( id ),
    PARTITION ( orderDate RANGE RIGHT
    FOR VALUES ('2004-01-01', '2005-01-01', '2006-01-01', '2007-01-01' )));

En este ejemplo, la tabla Orders tiene las siguientes particiones.In this example, the Orders table has the following partitions. Cada partición contiene datos.Each partition contains data.

ParticiónPartition ¿Tiene datos?Has data? Intervalo de límiteBoundary range
11 Yes OrderDate < '2004-01-01'OrderDate < '2004-01-01'
22 Yes '2004-01-01' <= OrderDate < '2005-01-01''2004-01-01' <= OrderDate < '2005-01-01'
33 Yes '2005-01-01' <= OrderDate< '2006-01-01''2005-01-01' <= OrderDate< '2006-01-01'
44 Yes '2006-01-01'<= OrderDate < '2007-01-01''2006-01-01'<= OrderDate < '2007-01-01'
55 Yes '2007-01-01' <= OrderDate'2007-01-01' <= OrderDate
     
  • Partición 1 (tiene datos): OrderDate < '2004-01-01'Partition 1 (has data): OrderDate < '2004-01-01'
  • Partición 2 (tiene datos): '2004-01-01' <= OrderDate < '2005-01-01'Partition 2 (has data): '2004-01-01' <= OrderDate < '2005-01-01'
  • Partición 3 (tiene datos): '2005-01-01' <= OrderDate< '2006-01-01'Partition 3 (has data): '2005-01-01' <= OrderDate< '2006-01-01'
  • Partición 4 (tiene datos): '2006-01-01'<= OrderDate < '2007-01-01'Partition 4 (has data): '2006-01-01'<= OrderDate < '2007-01-01'
  • Partición 5 (tiene datos): '2007-01-01' <= OrderDatePartition 5 (has data): '2007-01-01' <= OrderDate

La tabla OrdersHistory tiene el siguiente DDL, que tiene columnas y nombres de columna idénticos a los de la tabla Orders.The OrdersHistory table has the following DDL, which has identical columns and column names as the Orders table. Ambos tienen una distribución de hash en la columna id.Both are hash-distributed on the id column.

CREATE TABLE OrdersHistory (
   id INT,
   city VARCHAR (25),
   lastUpdateDate DATE,
   orderDate DATE )
WITH
    (DISTRIBUTION = HASH ( id ),
    PARTITION ( orderDate RANGE RIGHT
    FOR VALUES ( '2004-01-01' )));

Aunque las columnas y los nombres de columna deben ser iguales, no es necesario que los límites de partición sean iguales.Although the columns and column names must be the same, the partition boundaries don't need to be the same. En este ejemplo, la tabla OrdersHistory tiene las dos siguientes particiones y ambas están vacías:In this example, the OrdersHistory table has the following two partitions and both partitions are empty:

  • Partición 1 (sin datos): OrderDate < '2004-01-01'Partition 1 (no data): OrderDate < '2004-01-01'
  • Partición 2 (vacía): "2004-01-01" <= OrderDatePartition 2 (empty): '2004-01-01' <= OrderDate

En las dos tablas anteriores, el siguiente comando mueve todas las filas con OrderDate < '2004-01-01' de la tabla Orders a la tabla OrdersHistory.For the previous two tables, the following command moves all rows with OrderDate < '2004-01-01' from the Orders table to the OrdersHistory table.

ALTER TABLE Orders SWITCH PARTITION 1 TO OrdersHistory PARTITION 1;

Como resultado, la primera partición de Orders está vacía y la primera partición de OrdersHistory contiene datos.As a result, the first partition in Orders is empty and the first partition in OrdersHistory contains data. Ahora, las tablas aparecen como se muestra a continuación:The tables now appear as follows:

Tabla OrdersOrders table

  • Partición 1 (vacía): OrderDate < '2004-01-01'Partition 1 (empty): OrderDate < '2004-01-01'
  • Partición 2 (tiene datos): '2004-01-01' <= OrderDate < '2005-01-01'Partition 2 (has data): '2004-01-01' <= OrderDate < '2005-01-01'
  • Partición 3 (tiene datos): '2005-01-01' <= OrderDate< '2006-01-01'Partition 3 (has data): '2005-01-01' <= OrderDate< '2006-01-01'
  • Partición 4 (tiene datos): '2006-01-01'<= OrderDate < '2007-01-01'Partition 4 (has data): '2006-01-01'<= OrderDate < '2007-01-01'
  • Partición 5 (tiene datos): '2007-01-01' <= OrderDatePartition 5 (has data): '2007-01-01' <= OrderDate

Tabla OrdersHistoryOrdersHistory table

  • Partición 1 (tiene datos): OrderDate < '2004-01-01'Partition 1 (has data): OrderDate < '2004-01-01'
  • Partición 2 (vacía): "2004-01-01" <= OrderDatePartition 2 (empty): '2004-01-01' <= OrderDate

Para limpiar la tabla Orders, puede quitar la partición vacía combinando las particiones 1 y 2 de la forma siguiente:To clean up the Orders table, you can remove the empty partition by merging partitions 1 and 2 as follows:

ALTER TABLE Orders MERGE RANGE ('2004-01-01');

Después de la combinación, la tabla Orders tiene las siguientes particiones:After the merge, the Orders table has the following partitions:

Tabla OrdersOrders table

  • Partición 1 (tiene datos): OrderDate < "2005-01-01"Partition 1 (has data): OrderDate < '2005-01-01'
  • Partición 2 (tiene datos): '2005-01-01' <= OrderDate< '2006-01-01'Partition 2 (has data): '2005-01-01' <= OrderDate< '2006-01-01'
  • Partición 3 (tiene datos): '2006-01-01'<= OrderDate < '2007-01-01'Partition 3 (has data): '2006-01-01'<= OrderDate < '2007-01-01'
  • Partición 4 (tiene datos): '2007-01-01' <= OrderDatePartition 4 (has data): '2007-01-01' <= OrderDate

Supongamos que termina otro año y quiere archivar el año 2005.Suppose another year passes and you're ready to archive the year 2005. Puede asignar una partición vacía al año 2005 en la tabla OrdersHistory dividiendo la partición vacía como se indica a continuación:You can allocate an empty partition for the year 2005 in the OrdersHistory table by splitting the empty partition as follows:

ALTER TABLE OrdersHistory SPLIT RANGE ('2005-01-01');

Después de la división, la tabla OrdersHistory tiene las siguientes particiones:After the split, the OrdersHistory table has the following partitions:

Tabla OrdersHistoryOrdersHistory table

  • Partición 1 (tiene datos): OrderDate < '2004-01-01'Partition 1 (has data): OrderDate < '2004-01-01'
  • Partición 2 (vacía): "2004-01-01" < "2005-01-01"Partition 2 (empty): '2004-01-01' < '2005-01-01'
  • Partición 3 (vacía): "2005-01-01" <= OrderDatePartition 3 (empty): '2005-01-01' <= OrderDate

Consulte tambiénSee Also