Este artículo se tradujo de forma manual. Mueva el puntero sobre las frases del artículo para ver el texto original. |
Traducción
Original
|
ALTER TABLE (Transact-SQL)
Modifica una definición de tabla al alterar, agregar o quitar columnas y restricciones, reasignar particiones, o deshabilitar o habilitar restricciones y desencadenadores.
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 ]
[ NULL | NOT NULL ] [ SPARSE ]
| {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>)
| (<filetable_option>)
}
[ ; ]
-- 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 ) ]
}
<single_partition_rebuild__option> ::=
{
SORT_IN_TEMPDB = { ON | OFF }
| MAXDOP = max_degree_of_parallelism
| DATA_COMPRESSION = { NONE | ROW | PAGE} }
}
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 ejecutan 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 (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. 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, en algunas ediciones de SQL Server, agregar una columna NOT NULL con un valor predeterminado, pueden tardar mucho tiempo en completarse 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.
Agregar columnas NOT NULL como una operación en línea
En SQL Server 2012 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. Esto significa que la operación se ha completado de forma casi instantánea, independientemente del número de filas de la tabla. Esto se debe a que las filas existentes en la tabla no se actualizan durante la operación; 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. Este comportamiento es automático; no se requiere sintaxis adicional alguna para implementar la operación en línea aparte de la sintaxis de COLUMN ADD. 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 independientemente de su determinismo. Por ejemplo, la expresión constante “mis datos temporales” o la función del sistema GETUTCDATETIME() son constantes de tiempo de ejecución. 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. Cuando se agrega una columna NOT NULL con un valor predeterminado que no es una constante de tiempo de ejecución, se realiza siempre sin conexión y se adquiere un bloqueo exclusivo (SCH-M) mientras dura la operación.
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. 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 clúster se vuelve a generar.
Las columnas de tipo varchar(max), nvarchar(max), varbinary(max), xml, text, ntext, image, hierarchyid, geometry, geography o los UDT de CLR no se pueden agregar en una operación en línea. 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. En este caso, la columna se agrega como una operación sin conexión.
Ejecutar planes paralelos
En Microsoft SQL Server 2012 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 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. Para obtener más información, vea Establecer la opción de configuración del servidor Grado máximo de paralelismo.
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 sentencia 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.
Realizar 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 restricciones 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 el 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 se completa 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 bases de datos de publicaciones.
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 Compresión de datos.
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 <table> REBUILD PARTITION ... vuelve a generar la partición especificada.
-
La sintaxis ALTER TABLE <table> REBUILD WITH ... vuelve a generar todas las particiones.
La instrucción ALTER TABLE solo permite nombres de tabla de dos partes (esquema.objeto). En SQL Server 2012, la especificación de un nombre de tabla con uno de los siguientes formatos produce el error 117 en tiempo de compilación.
-
servidor.baseDeDatos.esquema.tabla
-
.baseDeDatos.esquema.tabla
-
..esquema.tabla
En versiones anteriores, al especificar el formato servidor.baseDeDatos.esquema.tabla se devolvía el error 4902. La especificación del formato .baseDeDatos.esquema.tabla o ..esquema.tabla se realizaba correctamente.
Para resolver el problema, quite el uso de un prefijo de 4 partes.
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.
A.Agregar una columna nueva
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 la otra 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 AdventureWorks2012 ; 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 usa con ALTER TABLE para deshabilitar la restricción y permitir una inserción que normalmente infringiría 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 usa la opción DISABLE TRIGGER de ALTER TABLE para deshabilitar el desencadenador y permitir una inserción que normalmente infringiría el desencadenador. ENABLE TRIGGER se usa después 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 AdventureWorks2012; 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 PRIMARY KEY en modo ONLINE
En el ejemplo siguiente se elimina una restricción KEY PRIMARY con la opción ONLINE establecida en ON.
USE AdventureWorks2012; 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 Person.Person y a continuación se quita la restricción FOREIGN KEY.
USE AdventureWorks2012 ;
GO
CREATE TABLE Person.ContactBackup
(ContactID int) ;
GO
ALTER TABLE Person.ContactBackup
ADD CONSTRAINT FK_ContactBacup_Contact FOREIGN KEY (ContactID)
REFERENCES Person.Person (BusinessEntityID) ;
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.Person de la base de datos AdventureWorks2012.
USE AdventureWorks2012; 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.
USE AdventureWorks2012; 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 de la base de datos AdventureWorks2012:
USE AdventureWorks2012; ALTER TABLE Person.Person 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 el í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 Compresión de datos.
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 el tipo de datos se requiere, incluso aunque no se cambie.
ALTER TABLE T3 ALTER COLUMN C2 varchar(50) COLLATE Latin1_General_BIN; GO
Nota