ALTER TABLE (Transact-SQL)

Modifica una definición de tabla al alterar, agregar o quitar columnas y restricciones, al reasignar particiones, o al deshabilitar o habilitar restricciones y desencadenadores.

Icono de vínculo a temasConvenciones de sintaxis de Transact-SQL

Sintaxis

ALTER TABLE [ database_name . [ schema_name ] . | schema_name . ] table_name 
{ 
    ALTER COLUMN column_name 
    { 
        [ type_schema_name. ] type_name [ ( { precision [ ,scale ] 
            | max | xml_schema_collection } ) ] 
        [ COLLATE collation_name ] 
        [ SPARSE | NULL | NOT NULL ] 
    | {ADD | DROP } 
        { ROWGUIDCOL | PERSISTED | NOT FOR REPLICATION | SPARSE }
    } 
        | [ WITH { CHECK | NOCHECK } ]

    | ADD 
    { 
        <column_definition>
      | <computed_column_definition>
      | <table_constraint> 
      | <column_set_definition> 
    } [ ,...n ]

    | DROP 
    { 
        [ CONSTRAINT ] constraint_name 
        [ WITH ( <drop_clustered_constraint_option> [ ,...n ] ) ]
        | COLUMN column_name 
    } [ ,...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 ]

    | SET ( FILESTREAM_ON = { partition_scheme_name | filegroup | 
                "default" | "NULL" } )

    | REBUILD 
      [ [PARTITION = ALL]
        [ WITH ( <rebuild_option> [ ,...n ] ) ] 
      | [ PARTITION = partition_number 
           [ WITH ( <single_partition_rebuild_option> [ ,...n ] ) ]
        ]
      ]

    | (<table_option>)
}
[ ; ]

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

<single_partition_rebuild__option> ::=
{
      SORT_IN_TEMPDB = { ON | OFF }
    | MAXDOP =max_degree_of_parallelism
    | DATA_COMPRESSION = { NONE | ROW | PAGE} }
}

Argumentos

  • database_name
    Es el nombre de la base de datos en la que se creó la tabla.

  • schema_name
    Es el nombre del esquema al que pertenece la tabla.

  • table_name
    Es el nombre de la tabla que se va a modificar. Si la tabla no se encuentra en la 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.

  • ALTER COLUMN
    Especifica que la columna con nombre va a cambiarse o modificarse. Para obtener más información, vea sp_dbcmptlevel (Transact-SQL).

    La columna modificada no puede ser ninguna de las siguientes:

    • Ser una columna con un tipo de datos timestamp.

    • Ser la columna ROWGUIDCOL de la tabla.

    • Ser una columna calculada ni utilizarse en una columna calculada.

    • Una que se use en un índice, a menos que la columna sea del tipo de datos varchar, nvarchar o varbinary, el tipo de datos no se cambie, el nuevo tamaño sea igual o mayor que el tamaño anterior, y el índice no sea el resultado de una restricción PRIMARY KEY.

    • Una que se use en las estadísticas generadas por la instrucción CREATE STATISTICS a menos que la columna sea del tipo de datos varchar, nvarchar o varbinary, el tipo de datos no se cambie y el nuevo tamaño sea igual o mayor que el tamaño anterior, o si la columna se cambia de NOT NULL a NULL. Quite primero las estadísticas con la instrucción DROP STATISTICS. Las estadísticas generadas automáticamente por el optimizador de consultas se quitan automáticamente con ALTER COLUMN.

    • Utilizarse en una restricción PRIMARY KEY o [FOREIGN KEY] REFERENCES.

    • Utilizarse en una restricción CHECK o UNIQUE. Sin embargo, se permite el cambio de longitud de una columna de longitud variable en una restricción CHECK o UNIQUE.

    • Asociarse a la definición predeterminada. No obstante, la longitud, precisión o escala de una columna puede cambiarse si el tipo de datos no se cambia.

      El tipo de datos de las columnas text, ntext e image puede cambiarse de las formas siguientes:

      • text por varchar(max), nvarchar(max) o xml

      • ntext por varchar(max), nvarchar(max) o xml

      • image por varbinary(max)

      Algunos cambios del tipo de datos podrían suponer un cambio en los datos. Por ejemplo, cambiar una columna nchar o nvarchar por una columna char o varchar puede suponer la conversión de caracteres extendidos. Para obtener más información, vea CAST y CONVERT (Transact-SQL). Reducir la precisión o escala de una columna puede dar como resultado que se trunquen los datos.

      El tipo de datos de una columna de una tabla con particiones no puede cambiarse.

  • column_name
    Es el nombre de la columna que se va a alterar, agregar o quitar. column_name puede tener un máximo de 128 caracteres. Si se trata de columnas nuevas, column_name se puede omitir en las columnas creadas con un tipo de datos timestamp. El nombre timestamp se usa si no se especifica un column_name para una columna del tipo de datos timestamp.

  • [ type_schema_name**.** ] type_name
    Es el nuevo tipo de datos de la columna alterada o el tipo de datos de la columna agregada. type_name no se puede especificar para las columnas existentes de tablas con particiones. type_name puede ser cualquiera de los siguientes:

    • Un tipo de datos del sistema de SQL Server.

    • Un tipo de datos del alias basado en el tipo de datos del sistema de SQL Server. 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.

    • Un tipo definido por el usuario de .NET Framework y el esquema al que pertenece. Los tipos definidos por el usuario de .NET Framework se crean con la instrucción CREATE TYPE antes de que puedan utilizarse en una definición de tabla.

    A continuación se indican los criterios de type_name en una columna alterada:

    • El tipo de datos anterior debe poderse convertir implícitamente al nuevo tipo de datos.

    • type_name no puede ser de tipo timestamp.

    • Los valores predeterminados de ANSI_NULL están siempre activados para ALTER COLUMN; si no se especifican, la columna admite valores NULL.

    • El relleno ANSI_PADDING está siempre activado para 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.

    • La configuración actual de SET ARITHABORT se pasa por alto. ALTER TABLE opera como si la opción ARITHABORT estuviera activada.

    [!NOTA]

    Si no se especifica la cláusula COLLATE, la modificación de un tipo de datos de columna tendrá como resultado un cambio de intercalación a la intercalación predeterminada de la base de datos.

  • precision
    Es la precisión del tipo de datos especificado. Para obtener más información acerca de los valores de precisión válidos, vea Precisión, escala y longitud (Transact-SQL).

  • scale
    Es la escala del tipo de datos especificado. Para obtener más información acerca de los valores de escala válidos, vea Precisión, escala y longitud (Transact-SQL).

  • max
    Solo se aplica a los tipos de datos varchar, nvarchar y varbinary para el almacenamiento de 2^31-1 bytes de datos de caracteres, datos binarios y datos Unicode.

  • xml_schema_collection
    Solo se aplica al tipo de datos xml para asociar un esquema XML con el tipo. Antes de escribir una columna xml en una colección de esquemas, la colección de esquemas debe crearse en la base de datos mediante el uso de CREATE XML SCHEMA COLLECTION.

  • COLLATE < collation_name >
    Especifica la nueva intercalación para la columna alterada. Si no se especifica, se asigna a la columna la intercalación predeterminada de la base de datos. El nombre de intercalación puede ser un nombre de intercalación de Windows o un nombre de intercalación de SQL. Para obtener más información y una lista de nombres de intercalación, vea Nombre de intercalación de Windows (Transact-SQL) y Nombre de intercalación de SQL Server (Transact-SQL).

    Es posible utilizar la cláusula COLLATE solo para alterar las intercalaciones de las columnas cuyo tipo de datos sea char, varchar, nchar y nvarchar. Para modificar la intercalación de una columna de tipo de datos de alias definido por el usuario, debe ejecutar distintas instrucciones ALTER TABLE para cambiar la columna por un tipo de datos del sistema de SQL Server y modificar su intercalación, y a continuación volver a modificar la columna para que sea un tipo de datos de alias.

    ALTER COLUMN no puede tener un cambio de intercalación si existe alguna de las siguientes condiciones:

    • Si una restricción CHECK, una restricción FOREIGN KEY o las columnas calculadas hacen referencia a la columna cambiada.

    • Si se ha creado algún índice, estadística o índice de texto en la columna. Las estadísticas creadas automáticamente en la columna cambiada se quitarán si se altera la intercalación de columna.

    • Si una función o vista enlazada a esquema hace referencia a la columna.

    Para obtener más información, vea COLLATE (Transact-SQL).

  • SPARSE | NULL | NOT NULL
    Especifica si la columna es una columna dispersa o puede aceptar valores NULL. Si la columna que se va a modificar es dispersa, debe especificar esta propiedad explícitamente o la columna revertirá a una columna no dispersa. Las columnas dispersas no se pueden designar como NOT NULL. Al convertir una columna de dispersa a no dispersa o viceversa, se bloquea la tabla durante la ejecución del comando.

    Para obtener restricciones adicionales y más información sobre columnas dispersas y la nulabilidad, vea Usar columnas dispersas.

    Las columnas que no permiten valores NULL solo se pueden agregar con ALTER TABLE si especifica un valor predeterminado para la columna o si toda la tabla está vacía. NOT NULL se puede especificar para las columnas calculadas solo si se especifica también 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. Si la nueva columna permite valores NULL y se 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.

    Si la nueva columna no permite valores NULL y la tabla no está vacía, debe agregarse una definición DEFAULT con la nueva columna y esta se carga automáticamente con el valor predeterminado en las nuevas columnas de cada fila existente.

    NULL puede especificarse 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. NOT NULL solo se puede especificar en ALTER COLUMN si la columna no contiene valores NULL. Los valores NULL deben actualizarse a algún valor para poder permitir ALTER COLUMN NOT NULL, como:

    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 y, posiblemente, invalidarán la nulabilidad para el tipo de datos utilizado en la definición de una columna. Recomendamos definir siempre explícitamente una columna como NULL o como NOT NULL en el caso de las columnas no calculadas.

    Si agrega una columna con un tipo de datos definido por el usuario, recomendamos definir la columna con la misma nulabilidad que la propiedad NULL del tipo de datos definido por el usuario y especificar un valor predeterminado para la columna. Para obtener más información, vea CREATE TABLE (Transact-SQL).

    [!NOTA]

    Si se especifica NULL o NOT NULL con ALTER COLUMN, también se debe especificar new_data_type [(precision [, scale ])]. Si el tipo de datos, la precisión y la escala no se cambian, especifique los valores actuales de la columna.

  • [ {ADD | DROP} ROWGUIDCOL ]
    Especifica que la propiedad ROWGUIDCOL se agrega a la columna indicada o se quita de ella. ROWGUIDCOL indica que la columna es una columna GUID de fila. Solo puede designarse una columna uniqueidentifier por tabla como la columna ROWGUIDCOL, y la propiedad ROWGUIDCOL solo puede asignarse a una columna uniqueidentifier. ROWGUIDCOL no puede asignarse a una columna de un tipo de datos definido por el usuario.

    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. Para generar valores únicos para cada columna, utilice la función NEWID en instrucciones INSERT o especifique la función NEWID como la predeterminada para la columna.

  • [ {ADD | DROP} PERSISTED ]
    Especifica que la propiedad PERSISTED se agrega a la columna indicada o se quita de ella. La columna debe ser una columna calculada definida mediante una expresión determinista. Para las columnas especificadas como PERSISTED, Database Engine (Motor de base de datos) almacena físicamente los valores calculados en la tabla y actualiza los valores cuando se actualiza una de las otras columnas de las que depende la columna calculada. Al marcar una columna calculada como PERSISTED, puede crear índices sobre columnas calculadas definidas sobre expresiones que son deterministas, pero no precisas. Para obtener más información, vea Crear índices en columnas calculadas.

    Las columnas calculadas que se utilizan como columna de partición de una tabla con particiones deben marcarse explícitamente como PERSISTED.

  • DROP NOT FOR REPLICATION
    Especifica que los valores de columnas de identidad se incrementan cuando los agentes de replicación realizan operaciones de inserción. Esta cláusula solo se puede especificar si column_name es una columna de identidad. Para obtener más información, vea Controlar restricciones, identidades y desencadenadores con NOT FOR REPLICATION.

  • SPARSE
    Especifica que la columna que se va a agregar o quitar es una columna dispersa. El almacenamiento de columnas dispersas está optimizado para los valores NULL. Las columnas dispersas no se pueden designar como NOT NULL. Al convertir una columna de dispersa a no dispersa o viceversa, se bloquea la tabla durante la ejecución del comando.

    [!NOTA]

    Debe especificar la propiedad SPARSE cada vez que modifique la columna o esta revertirá a una columna no dispersa.

    Para obtener restricciones adicionales y más información sobre columnas dispersas, vea Usar columnas dispersas.

  • WITH 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. Si no se especifica, se supone WITH CHECK para las restricciones nuevas y WITH NOCHECK para las restricciones que se han habilitado otra vez.

    Si no desea volver a comprobar las restricciones CHECK o FOREIGN KEY nuevas con los datos existentes, utilice WITH NOCHECK. No se recomienda que haga esto, excepto en casos muy contados. La nueva restricción se evaluará en todas las actualizaciones futuras. 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.

    El optimizador de consultas no considera las restricciones definidas como WITH NOCHECK. Estas restricciones se pasan por alto hasta que se vuelven a habilitar mediante ALTER TABLE table CHECK CONSTRAINT ALL.

  • ADD
    Especifica que se agregan una o más definiciones de columna, definiciones de columnas calculadas o restricciones de tabla.

  • DROP { [ CONSTRAINT ] constraint_name | COLUMN column_name }
    Especifica que constraint_name o column_name se ha quitado de la tabla. Se pueden enumerar múltiples columnas y restricciones.

    El nombre de la restricción, ya sea proporcionado por el sistema o definido por el usuario, puede determinarse mediante la consulta de las vistas de catálogo sys.check_constraint, sys.default_constraints, sys.key_constraints y sys.foreign_keys.

    Una restricción PRIMARY KEY no puede quitarse si existe un índice XML en la tabla.

    Una columna no puede quitarse cuando:

    • Se utiliza en un índice.

    • Se utiliza en una restricción CHECK, FOREIGN KEY, UNIQUE o PRIMARY KEY.

    • Está asociada con un valor predeterminado definido con la palabra clave DEFAULT o enlazada a un objeto predeterminado.

    • Está enlazada a una regla.

    [!NOTA]

    Quitar una columna no recupera el espacio en disco de la columna. 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. Recupere el espacio mediante la creación de un índice clúster de la tabla o regenerando un índice clúster existente mediante la utilización de ALTER INDEX.

  • WITH <drop_clustered_constraint_option>
    Especifica que se han establecido una o más opciones para quitar restricciones clúster.

  • MAXDOP = max_degree_of_parallelism
    Invalida la opción de configuración max degree of parallelism solo durante la operación. Para obtener más información, vea max degree of parallelism (opción).

    Utilice la opción MAXDOP para limitar el número de procesadores utilizados en la ejecución de planes paralelos. El máximo es 64 procesadores.

    max_degree_of_parallelism puede tener uno de los siguientes valores:

    • 1
      Suprime la generación de planes paralelos.

    • >1
      Restringe el número máximo de procesadores utilizados en una operación de índice paralelo para el número especificado.

    • 0 (valor predeterminado)
      Utiliza el número real, o un número inferior, de procesadores en función de la actual carga de trabajo del sistema.

    Para obtener más información, vea Configurar operaciones de índice en paralelo.

    [!NOTA]

    Las operaciones de índices en paralelo únicamente están disponibles en las ediciones Enterprise, Developer y Evaluation de SQL Server.

  • ONLINE = { ON | OFF }
    Especifica si las tablas subyacentes e índices asociados están disponibles para realizar consultas y modificar datos durante la operación de indización. El valor predeterminado es OFF. REBUILD se puede realizar como una operación ONLINE.

    • ON
      Los bloqueos de tabla de larga duración no se mantienen durante la operación de índice. Durante la fase principal de la operación, solo se mantiene un bloqueo de intención compartida (IS) en la tabla de origen. De esta forma, las consultas o actualizaciones realizadas sobre la tabla y los índices subyacentes pueden continuar. Al principio de la operación, se mantiene un bloqueo compartido (S) sobre el objeto de origen durante un breve espacio de tiempo. Al final de la operación, durante un breve espacio de tiempo, se adquiere un bloqueo compartido (S) sobre el origen si se está creando un índice no agrupado; o se adquiere un bloqueo SCH-M (modificación del esquema) cuando se crea o se quita un índice clúster en línea y cuando se regenera un índice clúster o no clúster. ONLINE no se puede establecer en ON cuando se crea un índice en una tabla temporal local. Solo se permite la operación de regeneración HEAP de un único subproceso.

    • OFF
      Los bloqueos de tabla se aplican durante la operación de índice. 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. Esto evita que todos los usuarios tengan acceso a la tabla subyacente durante la operación. Una operación de índice sin conexión que crea un índice no clúster adquiere un bloqueo compartido (S) en la tabla. Esto evita que se realicen actualizaciones en la tabla subyacente pero permite la realización de operaciones de lectura, como las instrucciones SELECT. Permite operaciones de regeneración HEAP de varios subprocesos.

    Para obtener más información, vea Cómo funcionan las operaciones de índice en línea. Para obtener más información acerca de los bloqueos, vea Modos de bloqueo.

    [!NOTA]

    Las operaciones de índices en línea únicamente están disponibles en las ediciones Enterprise, Developer y Evaluation de SQL Server.

  • MOVE TO { partition_scheme_name**(** column_name [ 1**,** ... n] ) | filegroup | "default" }
    Especifica una ubicación a la que mover las filas de datos que se encuentran en el nivel hoja del índice clúster. La tabla se mueve a la nueva ubicación.

    [!NOTA]

    En este contexto, el valor predeterminado no es una palabra clave. Es un identificador para el grupo de archivos predeterminado y debe delimitarse, como en MOVE TO "default" o en MOVE TO [default]. Si se especifica "default", la opción QUOTED_IDENTIFIER debe ser ON para la sesión actual. Ésta es la configuración predeterminada. Para obtener más información, vea SET QUOTED_IDENTIFIER (Transact-SQL).

  • { CHECK | NOCHECK } CONSTRAINT
    Especifica si constraint_name está habilitado o deshabilitado. Esta opción solo se puede utilizar con las restricciones FOREIGN KEY y CHECK. 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. Las restricciones DEFAULT, PRIMARY KEY y UNIQUE no se pueden deshabilitar.

  • ALL
    Especifica que todas las restricciones están deshabilitadas con la opción NOCHECK o habilitadas con la opción CHECK.

  • { ENABLE | DISABLE } TRIGGER
    Especifica si trigger_name está habilitado o deshabilitado. Aunque un desencadenador esté deshabilitado, sigue estando definido para la tabla; sin embargo, si se ejecutan las instrucciones INSERT, UPDATE o DELETE en la tabla, las acciones del desencadenador no se ejecutarán hasta que este se vuelva a habilitar.

  • ALL
    Especifica si todos los desencadenadores de la tabla están habilitados o deshabilitados.

  • trigger_name
    Especifica el nombre del desencadenador que se va a habilitar o deshabilitar.

  • { ENABLE | DISABLE } CHANGE_TRACKING
    Especifica si el seguimiento de cambios está habilitado o deshabilitado para la tabla. El seguimiento de cambios está deshabilitado de manera predeterminada.

    Esta opción solo está disponible cuando el seguimiento de cambios está habilitado para la base de datos. Para obtener más información, vea Opciones de ALTER DATABASE SET (Transact-SQL).

    Para habilitar el seguimiento de cambios, la tabla debe tener una clave principal.

  • WITH ( TRACK_COLUMNS_UPDATED = { ON | OFF } )
    Especifica si Database Engine (Motor de base de datos) realiza el seguimiento de las columnas sometidas a seguimiento de cambios que se actualizaron. El valor predeterminado es OFF.

  • SWITCH [ PARTITION source_partition_number_expression ] TO [ schema_name**.** ] target_table [ PARTITION target_ partition_number_expression ]
    Modifica un bloqueo de datos de una de las formas siguientes:

    • Vuelve a asignar todos los datos de una tabla como una partición en una tabla con particiones ya existente.

    • Modifica una partición de una tabla con particiones a otra.

    • Vuelve a asignar todos los datos de una partición de una tabla con particiones a una tabla con particiones ya existente.

    Si table es una tabla con particiones, se debe especificar source_partition_number_expression. Si target_table es una tabla con particiones, se debe especificar 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.

    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. Tanto la tabla o partición de origen como la tabla o partición de destino deben residir en el mismo grupo de archivos. Los índices correspondientes, o particiones de índice, también deben residir en el mismo grupo de archivos. Son muchas las restricciones adicionales que se aplican a las particiones que se modifican. Para obtener más información, vea Transferir datos de forma eficaz con cambios de particiones. table y target_table no pueden ser la misma. target_table puede ser un identificador con varias partes.

    source_partition_number_expression y target_partition_number_expression son expresiones constantes que pueden hacer referencia a variables y funciones. Incluyen las variables de tipos definidos por el usuario y las funciones definidas por el usuario. No pueden hacer referencia a las expresiones de Transact-SQL.  

    [!NOTA]

    No puede utilizar la instrucción SWITCH en tablas replicadas.

  • SET ( FILESTREAM_ON = { partition_scheme_name | filestream_filegroup_name | "default" | "NULL" })
    Especifica dónde se almacenan los datos FILESTREAM.

    La ejecución de ALTER TABLE con la cláusula SET FILESTREAM_ON será correcta únicamente si la tabla no tiene columnas FILESTREAM. Las columnas FILESTREAM se pueden agregar utilizando una segunda instrucción ALTER TABLE.

    Si se especifica partition_scheme_name, se aplican las reglas para CREATE TABLE. La tabla ya debería tener particiones para los datos de la fila y su esquema de partición debe utilizar la misma función de partición y columnas que el esquema de partición de FILESTREAM.

    filestream_filegroup_name especifica el nombre de un grupo de archivos FILESTREAM. 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.

    "default" especifica el grupo de archivos FILESTREAM con la propiedad DEFAULT establecida. Si no hay ningún grupo de archivos FILESTREAM, se produce un error.

    "NULL" especifica que se quitarán todas las referencias a los grupos de archivos FILESTREAM para la tabla. Se deben quitar todas las columnas FILESTREAM primero. Debe usar SET FILESTREAM_ON**="NULL"** para eliminar todos los datos FILESTREAM que estén asociados a una tabla.

  • SET ( LOCK_ESCALATION = { AUTO | TABLE | DISABLE } )
    Especifica los métodos permitidos de extensión de bloqueo para una tabla.

    • AUTO
      Esta opción permite a SQL Server Database Engine (Motor de base de datos de SQL Server) seleccionar la granularidad de la extensión de bloqueo que sea adecuada para el esquema de tabla.

      • Si la tabla tiene particiones, la extensión del bloqueo se permitirá en la partición. Una vez realizada la extensión del bloqueo hasta el nivel de la partición, el bloqueo no se extenderá a la granularidad de TABLE más adelante.

      • Si la tabla no tiene particiones, la extensión del bloqueo se aplicará a la granularidad de TABLE.

    • TABLE
      La extensión de bloqueo se aplicará a la granularidad en el nivel de tabla, independientemente de que la tabla tenga o no particiones. Este comportamiento es el mismo que en SQL Server 2005. TABLE es el valor predeterminado.

    • DISABLE
      Evita la extensión de bloqueo en la mayoría de los casos. No siempre se evitan los bloqueos del nivel de la tabla. Por ejemplo, si está examinando una tabla que no tiene ningún índice clúster en el nivel de aislamiento serializable, Database Engine (Motor de base de datos) debe realizar un bloqueo de la tabla para proteger la integridad de los datos.

  • REBUILD
    Utilice la sintaxis de REBUILD WITH para volver a generar una tabla completa que incluya todas las particiones en una tabla con particiones. Si la tabla tiene un índice clúster, la opción REBUILD vuelve a generarlo. REBUILD se puede realizar como una operación ONLINE.

    Utilice la sintaxis de REBUILD PARTITION para volver a generar una partición única en una tabla con particiones.

  • PARTITION = ALL
    Vuelve a generar todas las particiones al cambiar los valores de compresión de la partición.

  • REBUILD WITH ( <rebuild_option> )
    Todas las opciones se aplican a una tabla con un índice clúster. Si la tabla no tiene un índice clúster, solo algunas de las opciones afectan a la estructura del montón.

    Para obtener una descripción completa de las opciones de la regeneración, vea index_option (Transact-SQL).

  • DATA_COMPRESSION
    Especifica la opción de compresión de datos para la tabla, el número de partición o el intervalo de particiones especificados. Las opciones son las siguientes:

    • NONE
      No se comprimen la tabla ni las particiones especificadas.

    • ROW
      La tabla o las particiones especificadas se comprimen utilizando la compresión de fila.

    • PAGE
      La tabla o las particiones especificadas se comprimen utilizando la compresión de página.

    Para volver a generar al mismo tiempo varias particiones, vea index_option (Transact-SQL). Si la tabla no tiene un índice clúster, al cambiar la compresión de datos se vuelven a generar el montón y los índices no clúster. Para obtener más información acerca de la compresión, vea Crear tablas e índices comprimidos.

  • column_set_name XML COLUMN_SET FOR ALL_SPARSE_COLUMNS
    Es el nombre del conjunto de columnas. Un conjunto de columnas es una representación XML sin tipo que combina todas las columnas dispersas de una tabla en una salida estructurada. No se puede agregar un conjunto de columnas a una tabla que contenga columnas dispersas. Para obtener más información sobre los conjuntos de columnas, vea Utilizar conjuntos de columnas.

Notas

Para agregar nuevas filas de datos, utilice INSERT. Para quitar filas de datos, utilice DELETE o TRUNCATE TABLE. Para cambiar los valores de las filas existentes, utilice 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.

Cambiar el tamaño de una columna

Puede cambiar la longitud, precisión o escala de una columna especificando un nuevo tamaño para el tipo de datos de columna en la cláusula ALTER COLUMN. Si hay datos en la columna, el nuevo tamaño no puede ser menor que el tamaño máximo de los datos. Asimismo, la columna se puede definir 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. Vea el ejemplo P.

Bloqueos y ALTER TABLE

Los cambios especificados en ALTER TABLE se implementan inmediatamente. Si los cambios requieren modificaciones de las filas de la tabla, ALTER TABLE actualiza las filas. ALTER TABLE adquiere un bloqueo de modificación del esquema 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. En una operación ALTER TABLE…SWITCH, el bloqueo se adquiere tanto en las tablas de origen como en las de destino. Las modificaciones realizadas en la tabla se registran y son completamente recuperables. Los cambios que afectan a todas las filas de tablas muy grandes, como quitar una columna o agregar una columna NOT NULL con un valor predeterminado, pueden requerir mucho tiempo para su finalización y generan muchos registros. Estas instrucciones ALTER TABLE deben ejecutarse con el mismo cuidado que cualquier instrucción INSERT, UPDATE o DELETE que afecte a un gran número de filas.

Ejecución de planes paralelos

En SQL Server 2008 Enterprise, el número de procesadores utilizados para ejecutar una sola instrucción ALTER TABLE ADD (basada en índices) CONSTRAINT o DROP (índice clúster) CONSTRAINT viene determinado por la opción de configuración max degree of parallelism y la carga de trabajo actual. Si el Database Engine (Motor de base de datos) 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. Puede configurar manualmente el número de procesadores que se utilizan para ejecutar la instrucción si especifica la opción MAXDOP.

Tablas con particiones

Además de realizar operaciones SWITCH que implican a tablas con particiones, ALTER TABLE puede utilizarse 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. Sin embargo, esta instrucción no puede utilizarse para cambiar la forma en que se realizan las particiones de la tabla misma. Para volver a realizar las particiones de una tabla con particiones, utilice ALTER PARTITION SCHEME y ALTER PARTITION FUNCTION. Además, no puede cambiar el tipo de datos de una columna de una tabla con particiones.

Restricciones en tablas con vistas enlazadas a esquema

Las restricciones que se aplican a instrucciones ALTER TABLE en tablas con vistas enlazadas a esquema son las mismas que las que se aplican actualmente cuando se alteran tablas con un solo índice. Se permite agregar una columna. No obstante, no se permite quitar ni cambiar una columna que participa en una vista enlazada a esquema. 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 Database Engine (Motor de base de datos) genera un mensaje de error. Para obtener más información acerca de los enlaces a esquemas y vistas indizadas, vea CREATE VIEW (Transact-SQL).

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.

Índices y ALTER TABLE

Los índices creados como parte de una restricción se quitan cuando se quita la restricción. Los índices que se crearon con CREATE INDEX deben quitarse con DROP INDEX. La instrucción ALTER INDEX se puede emplear 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.

Todos los índices y restricciones basados en una columna deben eliminarse para que se pueda quitar la columna.

Cuando se elimina una restricción que ha creado un índice clúster, las filas de datos que se han almacenado en el nivel hoja del índice clúster se almacenan en una tabla no clúster. 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. La opción MOVE TO tiene las siguientes restricciones:

  • MOVE TO no es válido para vistas indizadas o índices no clúster.

  • El esquema de partición o el grupo de archivos debe existir previamente.

  • Si no se especifica MOVE TO, la tabla se ubicará en el mismo esquema de partición o grupo de archivos que se definió para el índice clúster.

Cuando quita un índice clúster, puede especificar 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 clúster asociados.

ONLINE = ON tiene las siguientes restricciones:

  • ONLINE = ON no es válida para índices clúster que también estén deshabilitados. Los índices deshabilitados deben quitarse con ONLINE = OFF.

  • Solo un índice puede quitarse cada vez.

  • ONLINE = ON no es válida para las vistas indizadas, índices no clúster ni índices de tablas temporales locales.

Para quitar un índice clúster, se necesita un espacio temporal en disco del mismo tamaño que el del índice clúster existente. Este espacio adicional se libera en cuanto finaliza la operación.

[!NOTA]

Las opciones enumeradas en <drop_clustered_constraint_option> se aplican a índices clúster de tablas y no pueden aplicarse a índices clúster de vistas o de índices no clúster.

Replicar cambios de esquema

De forma predeterminada, cuando se ejecuta ALTER TABLE en una tabla publicada en un publicador de SQL Server, el cambio se propaga a todos los suscriptores de SQL Server. Esta funcionalidad tiene algunas restricciones y se puede deshabilitar. Para obtener más información, vea Realizar cambios de esquema en las bases de datos de publicación.

Compresión de datos

En las tablas del sistema no se puede habilitar la compresión. Si la tabla es un montón, la operación de regeneración en modo ONLINE será de un solo subproceso. Utilice el modo OFFLINE para una operación de regeneración de montón de varios subprocesos. Para obtener más información acerca de la compresión de datos, vea Crear tablas e índices comprimidos.

Para evaluar cómo afecta el cambio del estado de compresión a una tabla, índice o partición, utilice el procedimiento almacenado sp_estimate_data_compression_savings.

Las restricciones siguientes se aplican a las tablas con particiones:

  • No se puede cambiar la configuración de compresión de una partición única si la tabla tiene índices no alineados.

  • La sintaxis ALTER TABLE <tabla> REBUILD PARTITION ... vuelve a generar la partición especificada.

  • La sintaxis ALTER TABLE <tabla> REBUILD WITH... vuelve a generar todas las particiones.

Permisos

Requiere el permiso ALTER en la tabla.

Los permisos ALTER TABLE se aplican a las tablas relacionadas con una instrucción ALTER TABLE SWITCH. Los datos que se modifican heredan la seguridad de la tabla de destino.

Si se define 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.

Ejemplos

A. Agregar una nueva columna

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. En la nueva columna, cada fila tendrá valores NULL.

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

B. Quitar una columna

En el ejemplo siguiente se modifica una tabla para quitar una columna.

CREATE TABLE dbo.doc_exb (column_a INT, column_b VARCHAR(20) NULL) ;
GO
ALTER TABLE dbo.doc_exb DROP COLUMN column_b ;
GO
EXEC sp_help doc_exb ;
GO
DROP TABLE dbo.doc_exb ;
GO

C. Cambiar el tipo de datos de una columna

En el ejemplo siguiente se modifica una columna de una tabla de INT a 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

D. Agregar una columna con una restricción

En el ejemplo siguiente se agrega una nueva columna con una restricción UNIQUE.

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

E. Agregar una restricción CHECK no comprobada a una columna existente

En el ejemplo siguiente se agrega una restricción a una columna existente de la tabla. La columna tiene un valor que infringe la restricción. Por lo tanto, WITH NOCHECK se utiliza para evitar que la restricción se valide en las filas existentes, y para poder agregar la restricción.

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

F. Agregar una restricción DEFAULT a una columna existente

En el ejemplo siguiente se crea una tabla con dos columnas y se inserta un valor en la primera, y el orden de la columna sigue siendo NULL. A continuación se agrega una restricción DEFAULT a la segunda columna. Para comprobar que se aplica el valor predeterminado, se inserta otro valor en la primera columna y se consulta la tabla.

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

G. Agregar varias columnas con restricciones

En el ejemplo siguiente se agregan varias columnas con restricciones que se definen con la nueva columna. La primera columna nueva tiene una propiedad IDENTITY. Cada fila de la tabla tiene nuevos valores incrementales en la columna de identidad.

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

H. Agregar una columna que admite valores NULL con valores predeterminados

En el ejemplo siguiente se agrega una columna que admite valores NULL con una definición DEFAULT y se utiliza WITH VALUES para proporcionar los valores de cada fila existente en la tabla. Si no se utiliza WITH VALUES, cada fila tiene el valor NULL en la nueva columna.

USE AdventureWorks ; 
GO
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

I. Deshabilitar y volver a habilitar una restricción

En el ejemplo siguiente se deshabilita una restricción que limita los salarios aceptados en los datos. NOCHECK CONSTRAINT se utiliza con ALTER TABLE para deshabilitar la restricción y permitir una inserción que normalmente infringe la restricción. CHECK CONSTRAINT vuelve a habilitar la restricción.

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

J. Quitar una restricción

En el ejemplo siguiente se quita una restricción UNIQUE de una tabla.

CREATE TABLE dbo.doc_exc ( column_a INT
CONSTRAINT my_constraint UNIQUE) ;
GO
ALTER TABLE dbo.doc_exc DROP CONSTRAINT my_constraint ;
GO
DROP TABLE dbo.doc_exc ;
GO

K. Cambiar las particiones entre tablas

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. 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. Los datos de PARTITION 2 de la tabla PartitionTable se cambian entonces a la tabla 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

L. Deshabilitar y volver a habilitar un desencadenador

En el ejemplo siguiente se utiliza la opción DISABLE TRIGGER de ALTER TABLE para deshabilitar el desencadenador y permitir una inserción que normalmente infringe el desencadenador. A continuación, ENABLE TRIGGER se utiliza para volver a habilitar el desencadenador.

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

M. Crear una restricción PRIMARY KEY con opciones de índice

En el ejemplo siguiente se crea la restricción PRIMARY KEY PK_TransactionHistoryArchive_TransactionID y se establecen las opciones FILLFACTOR, ONLINE y PAD_INDEX. El índice clúster resultante tendrá el mismo nombre que la restricción.

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

N. Quitar una restricción KEY PRIMARY en modo ONLINE

En el ejemplo siguiente se elimina una restricción KEY PRIMARY con la opción ONLINE establecida en ON.

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

O. Agregar y quitar una restricción FOREIGN KEY

En el ejemplo siguiente se crea la tabla ContactBackup y a continuación se altera la tabla; primero se agrega una restricción FOREIGN KEY que hace referencia a la tabla Contact y a continuación se quita la restricción FOREIGN KEY.

USE AdventureWorks ;
GO
CREATE TABLE Person.ContactBackup
(ContactID int) ;
GO
ALTER TABLE Person.ContactBackup
ADD CONSTRAINT FK_ContactBacup_Contact FOREIGN KEY (ContactID)
    REFERENCES Person.Contact (ContactID) ;
ALTER TABLE Person.ContactBackup
DROP CONSTRAINT FK_ContactBacup_Contact ;
GO
DROP TABLE Person.ContactBackup ;

P. Cambiar el tamaño de una columna

En el ejemplo siguiente se aumenta el tamaño de una columna varchar y la precisión y escala de una columna decimal. Dado que las columnas contienen datos, solo se puede aumentar el tamaño de columna. Observe también que col_a se define en un índice único. 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.

IF OBJECT_ID ( 'dbo.doc_exy', 'U' ) IS NOT NULL 
    DROP TABLE dbo.doc_exy;
GO
-- 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');

Q. Permitir la extensión de bloqueo en tablas con particiones

En el ejemplo siguiente se habilita la extensión de bloqueo al nivel de partición en una tabla con particiones. Si la tabla no tiene particiones, la extensión del bloqueo se aplicará en el nivel de tabla.

ALTER TABLE T1 SET (LOCK_ESCALATION = AUTO)
GO

R. Configurar el seguimiento de cambios en una tabla

En el ejemplo siguiente se habilita el seguimiento de cambios en la tabla Person.Contact de la base de datos AdventureWorks.

USE AdventureWorks;
ALTER TABLE Person.Contact
ENABLE CHANGE_TRACKING;

El ejemplo siguiente habilita el seguimiento de cambios y el seguimiento de las columnas que se actualizan durante un cambio.

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

En el ejemplo siguiente se deshabilita el seguimiento de cambios en la tabla Person.Contact de la base de datos AdventureWorks:

USE AdventureWorks;
ALTER TABLE Person.Contact
DISABLE CHANGE_TRACKING;

S. Modificar una tabla para cambiar la compresión

En el ejemplo siguiente se cambia la compresión de una tabla sin particiones. Se volverá a generar el montón o índice clúster. Si la tabla es un montón, se volverán a generar todos los índices no clúster.

ALTER TABLE T1 
REBUILD WITH (DATA_COMPRESSION = PAGE);

En el ejemplo siguiente se cambia la compresión de una tabla con particiones. La sintaxis REBUILD PARTITION = 1 hace que solo se vuelva a generar la partición número 1.

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.

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

Para obtener más ejemplos de la compresión de datos, vea Crear tablas e índices comprimidos.

T. Agregar una columna dispersa

En los ejemplos siguientes se muestra cómo agregar y modificar columnas dispersas en la tabla T1. El código para crear la tabla T1 es el siguiente.

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.

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.

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.

ALTER TABLE T1
ALTER COLUMN C4 DROP SPARSE;
GO

U. Agregar un conjunto de columnas

En los ejemplos siguientes se muestra cómo agregar una columna a la tabla T2. No se puede agregar un conjunto de columnas a una tabla si esta ya contiene columnas dispersas. El código para crear la tabla T2 es el siguiente.

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 por 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

V. Cambiar la intercalación de columnas

En el siguiente ejemplo se muestra cómo cambiar la intercalación de una columna. Primero creamos la tabla T3 con las intercalaciones de usuario predeterminadas:

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

Luego, la intercalación de la columna C2 se cambia por Latin1_General_BIN. Observe que se requiere el tipo de datos, aunque no se cambie.

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

Historial de cambios del documento

Contenido actualizado

Se ha corregido la opción AUTO de extensión de bloqueo.

Se ha agregado [SPARSE] a las propiedades de la sintaxis (antes de [NULL | NOT NULL].

Se ha agregado información sobre los UDT, los valores predeterminados y la nulabilidad en la sección Argumentos.

Se ha agregado información adicional a la definición de sintaxis de SPARSE en la sección Argumentos.

Se ha agregado un ejemplo que muestra cómo cambiar la intercalación de columnas y el requisito de que se vuelva a especificar el tipo de datos.