ALTER TABLE (Transact-SQL)
Изменяет определение таблицы путем изменения, добавления или удаления столбцов и ограничений, переназначения секций, а также отключения или включения ограничений и триггеров.
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>)
}
[ ; ]
<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} }
}
При наличии в кэше процедур каких-либо планов выполнения, ссылающихся на таблицу, инструкция ALTER TABLE помечает их как подлежащие перекомпиляции в их следующем выполнении.
Изменение размера столбца
Длину, точность и масштаб столбца можно изменить, указав новый размер для типа данных столбца в предложении ALTER COLUMN. Если в столбце имеются данные, новый размер не может быть меньше максимального размера данных. Кроме того, столбец нельзя определять в индексе, если тип данных столбца не относится к varchar, nvarchar или varbinary, а индекс не является результатом ограничения PRIMARY KEY. См. пример Р.
Блокировки и инструкция ALTER TABLE
Изменения, указанные в инструкции ALTER TABLE, воплощаются немедленно. Если для изменений требуется модификация строк таблицы, то инструкция ALTER TABLE обновляет эти строки. Инструкция ALTER TABLE получает блокировку модификации схемы для таблицы, чтобы убедиться, что в процессе изменения другие соединения не ссылаются даже на метаданные таблицы, за исключением операций с индексами в сети, требующих очень короткой блокировки SCH-M в конце. В операции ALTER TABLE...SWITCH запрашивается блокировка и исходной, и целевой таблиц. Изменения, сделанные в таблице, регистрируются в журнале и полностью обратимы. Изменения, затрагивающие все строки в очень больших таблицах, например удаление столбца или добавление столбца NOT NULL со значением по умолчанию, могут потребовать длительного времени и привести к формированию множества журнальных записей. Данные инструкции ALTER TABLE следует выполнять с той же осторожностью, что и любые инструкции INSERT, UPDATE или DELETE, влияющие на множество строк.
Выполнение параллельного плана
В выпуске SQL Server 2008 Enterprise число процессоров, применяемых для выполнения одной инструкции ALTER TABLE ADD (на базе индекса) CONSTRAINT или DROP (кластеризованный индекс) CONSTRAINT, определяется с помощью параметра конфигурации max degree of parallelism и текущей рабочей нагрузки. Если компонент Database Engine определяет, что система занята, то перед началом выполнения инструкции степень параллелизма операции автоматически понижается. Можно вручную настроить число процессоров, применяемых для запуска инструкции, указав параметр MAXDOP.
Секционированные таблицы
Помимо выполнения операций SWITCH, затрагивающих секционированные таблицы, инструкция ALTER TABLE может использоваться для изменения состояния столбцов, ограничений и триггеров секционированной таблицы точно так же, как она используется для несекционированных таблиц. Однако данная инструкция не может использоваться для изменения способа, которым секционируется сама таблица. Чтобы заново секционировать секционированную таблицу, используйте ALTER PARTITION SCHEME и ALTER PARTITION FUNCTION. Кроме того, невозможно изменить тип данных столбца секционированной таблицы.
Ограничения в таблицах с представлениями, привязанными к схемам
К инструкциям ALTER TABLE в таблицах с представлениями, привязанными к схемам, применяются те же ограничения, которые применяются в текущем времени для изменения таблиц с простым индексом. Добавление столбца разрешено. Однако удаление или изменение столбца, участвующего в любом из представлений, привязанных к схемам, не разрешается. Если инструкция ALTER TABLE требует изменения столбца, используемого в привязанном к схеме представлении, то происходит сбой инструкции ALTER TABLE и компонент Database Engine выдает сообщение об ошибке. Дополнительные сведения о привязке к схеме и индексированных представлениях см. в разделе CREATE VIEW (Transact-SQL).
Создание ссылающегося на таблицы представления, привязанного к схеме, не влияет на добавление или удаление триггеров в базовых таблицах.
Индексы и инструкция ALTER TABLE
При удалении ограничений индексы, создаваемые как часть ограничения, удаляются. Индексы, создаваемые при помощи инструкции CREATE INDEX, должны удаляться при помощи инструкции DROP INDEX. Инструкция ALTER INDEX может использоваться для перестроения индексной части определения ограничения; не следует удалять и вновь добавлять ограничение при помощи инструкции ALTER TABLE.
Перед удалением столбца необходимо удалить все индексы и ограничения, основанные на столбце.
После удаления ограничения, создавшего кластеризованный индекс, строки данных, хранившиеся на конечном уровне кластеризованного индекса, хранятся в некластеризованной таблице. Можно удалить кластеризованный индекс и переместить полученную в результате таблицу в другую файловую группу или схему секционирования в одной транзакции, указав параметр MOVE TO. Параметр MOVE TO обладает следующими ограничениями.
-
Параметр MOVE TO недопустим для индексированных представлений и некластеризованных индексов.
-
Схема секционирования или файловая группа уже должна существовать.
-
Если не указан аргумент MOVE TO, то таблица будет размещена в той же схеме секционирования или файловой группе, которая была определена для кластеризованного индекса.
При удалении кластеризованного индекса можно указать параметр ONLINE = ON, так что транзакция DROP INDEX не будет блокировать запросы к лежащим в основе данным и изменениям в них, а также в связанных с ними некластеризованных индексах.
Параметр ONLINE = ON имеет следующие ограничения.
-
Недопустимо использование параметра ONLINE = ON для кластеризованных индексов, которые также отключены. Отключенные индексы должны удаляться при помощи параметра ONLINE = OFF.
-
Только один индекс может удаляться единовременно.
-
Недопустимо использование параметра ONLINE = ON для индексированного представления, некластеризованных индексов или индексов в локальных временных таблицах.
Для удаления кластеризованного индекса временно требуется место на диске, равное размеру существующего кластеризованного индекса. Это дополнительное пространство освобождается сразу после завершения операции.
Примечание
|
|---|
|
Параметры, перечисленные в <drop_clustered_constraint_option>, применяются к кластеризованным индексам таблиц. Они не могут применяться к кластеризованным индексам представлений или к некластеризованным индексам. |
Репликация изменений схемы
По умолчанию при выполнении команды ALTER TABLE для опубликованной таблицы в издателе SQL Server Publisher это изменение распространяется для всех подписчиков SQL Server. Эта функция имеет некоторые ограничения и может быть отключена. Дополнительные сведения см. в разделе Внесение изменений схем в базы данных публикаций.
Сжатие данных
В системных таблицах не может быть включено сжатие. Если таблица является кучей, то операция перестроения в режиме ONLINE будет однопотоковой. Используйте режим OFFLINE для выполнения многопотоковых операций перестроения кучи. Дополнительные сведения о сжатии данных см. в разделе Создание сжатых таблиц и индексов.
Оценить состояние сжатия таблицы, индекса или секции можно с помощью хранимой процедуры sp_estimate_data_compression_savings.
На секционированные таблицы налагаются следующие ограничения.
-
Если у таблицы есть невыровненные индексы, изменить настройку сжатия отдельной секции невозможно.
-
Инструкция ALTER TABLE <table> REBUILD PARTITION ... производит перестроение указанной секции.
-
Инструкция ALTER TABLE <table> REBUILD WITH ... производит перестроение всех секций.
Требуется разрешение ALTER на таблицу.
Разрешения ALTER TABLE применяются к обеим таблицам, затронутым инструкцией ALTER TABLE SWITCH. Любые переключенные данные наследуют защиту целевой таблицы.
Если какой-либо из столбцов в инструкции ALTER TABLE является определяемым пользователем типом для среды CLR или как псевдоним типа данных, то на этот тип требуется разрешение REFERENCES.
А. Добавление нового столбца
Следующий пример показывает добавление столбца, который допускает значения NULL и не имеет значений, предоставленных через определение DEFAULT. В новом столбце в каждой строке будет 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
Б. Удаление столбца
В следующем примере для удаления столбца изменяется таблица.
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
В. Изменение типа данных столбца
Следующий пример меняет столбец таблицы с INT на 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
Г. Добавление столбца с ограничением
Следующий пример добавляет новый столбец с ограничением 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
Д. Добавление непроверяемого ограничения CHECK к существующему столбцу
В следующем примере к существующему столбцу в таблице добавляется ограничение. Столбец имеет значение, нарушающее это ограничение. Поэтому во избежание проверки ограничения относительно существующих строк, а также, чтобы разрешить добавление ограничения, применяется WITH NOCHECK.
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
Е. Добавление ограничения DEFAULT к существующему столбцу
Следующий пример показывает создание таблицы с двумя столбцами и заполнение значениями первого столбца; в другом столбце остается NULL. В таком случае во второй столбец добавляется ограничение DEFAULT. Чтобы проверить применение значения по умолчанию, в первый столбец вставляется другое значение и создается запрос к таблице.
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
Ж. Добавление нескольких столбцов с ограничениями
Следующий пример показывает добавление нескольких столбцов с ограничениями, которые определяются с помощью нового столбца. Первый новый столбец имеет свойство IDENTITY. Каждая строка таблицы имеет новые добавочные значения в столбце идентификаторов.
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
З. Добавление столбца, допускающего значения NULL, со значениями по умолчанию
Следующий пример показывает добавление столбца, допускающего значения NULL, с определением DEFAULT и использование WITH VALUES для предоставления значений каждой строке таблицы. Если аргумент WITH VALUES не используется, то каждая строка в новом столбце имеет значение NULL.
USE AdventureWorks2008R2 ; 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
И. Отключение и повторное включение ограничения
Следующий пример показывает отключение ограничения, служащее пределом указанной в данных зарплаты. NOCHECK CONSTRAINT используется с ALTER TABLE для отключения ограничения и разрешения вставки, которая обычно нарушает ограничение. CHECK 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) ;
К. Удаление ограничения
Следующий пример удаляет ограничение UNIQUE из таблицы.
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
Л. Переключение секций между таблицами
В следующем примере демонстрируется создание секционированной таблицы, исходя из предположения, что схема секционирования myRangePS1 уже создана в базе данных. Затем создается несекционированная таблица с такой же структурой, что и секционированная таблица, и в той же файловой группе, что и PARTITION 2 таблицы PartitionTable. Данные PARTITION 2 таблицы PartitionTable в таком случае переключаются в таблицу 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
М. Отключение и повторное включение триггера
Следующий пример показывает использование параметра DISABLE TRIGGERALTER TABLE для отключения триггера и допущения вставки, которая, как правило, нарушает триггер. Тогда ENABLE 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
Н. Создание ограничения PRIMARY KEY с параметрами индекса
Следующий пример показывает создание ограничения PRIMARY KEY PK_TransactionHistoryArchive_TransactionID и установку параметров FILLFACTOR, ONLINE и PAD_INDEX. Результирующий кластеризованный индекс будет иметь такое же имя, что и ограничение.
USE AdventureWorks2008R2; 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
О. Удаление ограничения PRIMARY KEY в режиме ONLINE
В следующем примере удаляется ограничение PRIMARY KEY с параметром ONLINE, имеющим значение ON.
USE AdventureWorks2008R2; GO ALTER TABLE Production.TransactionHistoryArchive DROP CONSTRAINT PK_TransactionHistoryArchive_TransactionID WITH (ONLINE = ON); GO
П. Добавление и удаление ограничения FOREIGN KEY
Следующий пример показывает создание таблицы ContactBackup, а затем ее изменение сначала добавлением ограничения FOREIGN KEY, ссылающегося на таблицу Person, затем удалением ограничения FOREIGN KEY.
USE AdventureWorks2008R2 ;
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 ;
Р. Изменение размера столбца
В следующем примере выполняется увеличение размера столбца varchar, а также точности и масштаба столбца decimal. Поскольку столбцы содержат данные, их размер можно только увеличить. Также обратите внимание, что столбец col_a определяется в уникальном индексе. Размер столбца col_a можно увеличивать, поскольку он имеет тип данных varchar, а индекс не является результатом ограничения PRIMARY KEY.
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');
С. Разрешение укрупнения блокировки для секционированных таблиц
В следующем примере укрупнение блокировки разрешается на уровне секции в секционированной таблице. Если таблица не секционирована, то блокировка будет укрупняться до уровня TABLE.
ALTER TABLE T1 SET (LOCK_ESCALATION = AUTO); GO
Т. Настройка отслеживания изменений для таблицы
В следующем примере отслеживание изменений разрешается в таблице Person.Person в базе данных База данных AdventureWorks2008R2.
USE AdventureWorks2008R2; ALTER TABLE Person.Person ENABLE CHANGE_TRACKING;
В следующем примере разрешается отслеживание изменений и отслеживание столбцов, которые обновляются при внесении изменений.
USE AdventureWorks2008R2; ALTER TABLE Person.Person ENABLE CHANGE_TRACKING WITH (TRACK_COLUMNS_UPDATED = ON);
В следующем примере отслеживание изменений запрещается в таблице Person.Person в базе данных База данных AdventureWorks2008R2.
USE AdventureWorks2008R2; ALTER TABLE Person.Person DISABLE CHANGE_TRACKING;
У. Изменение таблицы для изменения режима сжатия
В следующем примере изменяется режим сжатия несекционированной таблицы. Куча или кластеризованный индекс будет перестроен. Если таблица является кучей, то все некластеризованные индексы будут перестроены.
ALTER TABLE T1 REBUILD WITH (DATA_COMPRESSION = PAGE);
В следующем примере изменяется режим сжатия секционированной таблицы. Инструкция REBUILD PARTITION = 1 вызывает перестройку только секции с номером 1.
ALTER TABLE PartitionTable1 REBUILD PARTITION = 1 WITH (DATA_COMPRESSION = NONE) ; GO
Та же операция, использующая следующий альтернативный синтаксис, вызывает повторное построение всех секций в таблице.
ALTER TABLE PartitionTable1 REBUILD PARTITION = ALL WITH (DATA_COMPRESSION = PAGE ON PARTITIONS(1) ) ;
Дополнительные примеры сжатия данных см. в разделе Создание сжатых таблиц и индексов.
Ф. Добавление разреженного столбца
В следующих примерах показывается добавление и изменение разреженных столбцов в таблице T1. Код для создания таблицы T1 следующий:
CREATE TABLE T1 (C1 int PRIMARY KEY, C2 varchar(50) SPARSE NULL, C3 int SPARSE NULL, C4 int ) ; GO
Чтобы добавить дополнительный разреженный столбец C5, выполните следующую инструкцию.
ALTER TABLE T1 ADD C5 char(100) SPARSE NULL ; GO
Чтобы преобразовать неразреженный столбец C4 в разреженный, выполните следующую инструкцию.
ALTER TABLE T1 ALTER COLUMN C4 ADD SPARSE ; GO
Чтобы преобразовать разреженный столбец C4 в неразреженный, выполните следующую инструкцию.
ALTER TABLE T1 ALTER COLUMN C4 DROP SPARSE; GO
Х. Добавление набора столбцов
В следующих примерах показано добавление столбца к таблице T2. Набор столбцов не может быть добавлен в таблицу, если в ней уже содержатся разреженные столбцы. Код для создания таблицы T2:
CREATE TABLE T2 (C1 int PRIMARY KEY, C2 varchar(50) NULL, C3 int NULL, C4 int ) ; GO
В следующих трех инструкциях добавляется набор столбцов с именем CS, после чего изменяются столбцы C2 и C3 на 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
Ф. Изменение параметров сортировки столбца
В следующем примере демонстрируется изменение параметров сортировки столбца. Сначала создается таблица T3 с пользовательскими параметрами сортировки, настроенными по умолчанию:
CREATE TABLE T3 (C1 int PRIMARY KEY, C2 varchar(50) NULL, C3 int NULL, C4 int ) ; GO
Затем параметр сортировки столбца C2 изменяется на Latin1_General_BIN. Обратите внимание, что необходимо указать тип данных, хотя он не изменяется.
ALTER TABLE T3 ALTER COLUMN C2 varchar(50) COLLATE Latin1_General_BIN GO
