Синтаксис 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 ] ) ] } [ ,...n ] | COLUMN { column_name } [ ,...n ] } [ ,...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} } } Аргументы database_name Имя базы данных, в которой создана таблица. schema_name Имя схемы, которой принадлежит таблица. table_name Имя таблицы, подлежащей изменению. Если таблицы нет в текущей базе данных или она не содержится в схеме, которой владеет текущий пользователь, то и база данных, и схема должны быть явно указаны. ALTER COLUMN Указывает, что именованный столбец подлежит изменению. Нельзя изменять следующие столбцы. Столбец с типом данных timestamp. Свойство ROWGUIDCOL для таблицы. Вычисляемый столбец или используемый в вычисляемом столбце. Используется в статистике, сформированной предложением CREATE STATISTICS, если столбец не относится к типу данных varchar, nvarchar или varbinary, тип данных не изменяется, а новый размер будет больше старого или равен ему либо если столбец изменяется так, что допускает значения NULL. Во-первых, удалите статистику, используя инструкцию DROP STATISTICS.Статистика, автоматически сформированная оптимизатором запросов, автоматически удаляется инструкцией ALTER COLUMN. Используется в ограничении PRIMARY KEY или [FOREIGN KEY] REFERENCES. Используется в ограничениях CHECK или UNIQUE. Однако допустимо изменение длины столбца изменяемой длины, используемого в ограничении CHECK или UNIQUE. Связано с определением по умолчанию. Однако если тип данных не изменен, то длина, точность или масштаб столбца могут быть изменены. Тип данных столбцов text, ntext и image может быть изменен только следующими способами: o text на varchar(max), nvarchar(max) или xml; o ntext на varchar(max), nvarchar(max) или xml; o image в varbinary(max) Некоторые изменения типов данных могут повлечь за собой изменения в данных. Например, изменение столбца типа nchar или типа nvarchar на char или varchar может вызвать преобразование символов национальных алфавитов. Дополнительные сведения см. в разделе Функции CAST и CONVERT (Transact-SQL). Снижение точности или масштаба столбца может привести к усечению данных. Нельзя изменять тип данных столбца секционированной таблицы. Тип данных столбцов, включенных в индекс, можно изменить только в том случае, если столбец принадлежит к типу данных varchar, nvarchar или varbinary и новый размер больше старого или равен ему. Столбцы, включенные в ограничение первичного ключа, не могут быть изменены с NOT NULL на NULL. column_name Имя столбца, который требуется изменить, добавить или удалить. Длина значения column_name не может превышать 128 символов. Для новых столбцов аргумент column_name может быть опущен, если столбцы создаются с типом данных timestamp. Имя timestamp используется, если column_name не указано для столбца типа данных timestamp. [ type_schema_name. ] type_name Новый тип данных для изменяемого столбца либо тип данных для добавляемого столбца. Значение type_name нельзя задать для существующих столбцов секционированных таблиц. type_nameможет быть любым из следующих значений: Системным типом данных SQL Server. Псевдонимом типа данных, основанным на системном типе данных SQL Server. Прежде чем псевдонимы типов данных можно будет использовать в определении таблицы, их нужно создать с помощью инструкции CREATE TYPE. Определяемый пользователем тип .NET Framework и схема, к которой он принадлежит. Чтобы определяемые пользователем типы .NET Framework можно было использовать в определении столбца, их сначала нужно создать с помощью инструкции CREATE TYPE. Далее приведены критерии для аргумента type_name изменяемого столбца. Предыдущие типы данных должны быть неявно преобразуемыми в новый тип данных. type_name не может иметь тип timestamp. По умолчанию для аргумента ANSI_NULL инструкции ALTER COLUMN всегда установлено значение ON; если не указано иное, столбец может содержать значения NULL. Аргумент заполнения ANSI_PADDING для инструкции ALTER COLUMN всегда принимает значение ON. Если изменяемый столбец является столбцом идентификаторов, то аргумент new_data_type должен иметь тип данных, который поддерживает свойство идентификатора. Текущая установка для аргумента SET ARITHABORT пропускается. Инструкция ALTER TABLE функционирует аналогично случаю, когда для аргумента ARITHABORT установлено значение ON. precision Точность указанного типа данных. Дополнительные сведения о допустимых значениях точности см. в разделе Точность, масштаб и длина (Transact-SQL). scale Масштаб указанного типа данных. Дополнительные сведения о допустимых значениях масштаба см. в разделе Точность, масштаб и длина (Transact-SQL). max Применим только к типам данных varchar, nvarchar и varbinary для хранения 2^31-1 байт символов, двоичных данных и данных Юникода. xml_schema_collection Применяется только к данным типа xml для связывания XML-схемы с этим типом. Перед вводом столбца xml в коллекцию схемы необходимо при помощи CREATE XML SCHEMA COLLECTIONсоздать коллекцию схемы в базе данных. COLLATE < collation_name > Задает новые параметры сортировки для изменяемого столбца. Если не указано, столбцу назначаются параметры сортировки, принятые в базе данных по умолчанию. Именем параметров сортировки может быть либо имя параметров сортировки Windows, либо имя параметров сортировки SQL. Предложение COLLATE может быть использовано для изменения параметров сортировки только для столбцов типов данных char, varchar, nchar и nvarchar. Чтобы изменить параметры сортировки столбца пользовательского псевдонима типа данных, необходимо выполнить отдельные инструкции ALTER TABLE, чтобы изменить столбец на системный тип данных SQL Server, изменить параметры сортировки, а затем снова перевести столбец в псевдоним типа данных. Инструкция ALTER COLUMN не может изменить параметры сортировки, если выполняется одно или несколько из следующих условий: Если на изменяемый столбец ссылается ограничение CHECK, ограничение FOREIGN KEY или вычисляемые столбцы. Если на базе столбца создан какой-нибудь индекс, статистика или полнотекстовый индекс. Статистика, автоматически созданная на базе изменяемого столбца, удаляется, если изменяются параметры сортировки столбца. Если связанное со схемой представление или функция ссылаются на столбец. NULL | NOT NULL Указывает, может ли столбец принимать значения NULL. Столбцы, не допускающие значения NULL, могут быть добавлены инструкцией ALTER TABLE только в том случае, если для них указаны значения по умолчанию или если таблица пуста. Ограничение NOT NULL может быть указано для вычисляемых столбцов только в случае, если одновременно указан параметр PERSISTED. Если новый столбец допускает значения NULL, а значение по умолчанию не задано, то новый столбец содержит значение NULL для каждой строки в таблице. Если новый столбец допускает значение NULL, а определение по умолчанию добавляется с новым столбцом, то инструкция WITH VALUES может использоваться для хранения значений по умолчанию в новом столбце для каждой существующей строки в таблице. Если новый столбец не допускает значение NULL и таблица не пуста, то определение DEFAULT должно быть добавлено с новым столбцом. Новый столбец автоматически загружается со значениями по умолчанию в каждой существующей строке нового столбца. Значение NULL может указываться в инструкции ALTER COLUMN, чтобы принудить столбец NOT NULL допускать значения NULL, за исключением столбцов в ограничениях PRIMARY KEY.Значение NOT NULL может быть указано в инструкции ALTER COLUMN, только если столбец не содержит значения NULL. Значения NULL следует обновить, присвоив некоторые значения, прежде чем разрешить инструкцию ALTER COLUMN NOT NULL, например: UPDATE MyTable SET NullCol = N'some_value' WHERE NullCol IS NULL; ALTER TABLE MyTable ALTER COLUMN NullCOl NVARCHAR(20) NOT NULL; При создании или изменении таблицы инструкцией CREATE TABLE или ALTER TABLE установки базы данных и сеанса изменяются и, возможно, переопределяют разрешение содержать значение NULL для типа данных, используемого в определении столбца. Рекомендуется всегда явно определять невычисляемые столбцы как NULL или NOT NULL. Если добавляется столбец определяемого пользователем типа данных, то рекомендуется определить для этого столбца то же состояние допустимости значений NULL, что и в определяемом пользователем типе данных и задать для него значение по умолчанию. [ {ADD | DROP} ROWGUIDCOL ] Указывает свойство ROWGUIDCOL, добавленное к указанному столбцу или удаленное из него. Свойство ROWGUIDCOL указывает, что данный столбец является столбцом идентификатора GUID строки. Только один столбец типа uniqueidentifier в таблице может быть выделен как столбец ROWGUIDCOL, и свойство ROWGUIDCOL может присваиваться только столбцу uniqueidentifier. Нельзя присваивать свойство ROWGUIDCOL столбцу определяемого пользователем типа данных. Свойство ROWGUIDCOL не обеспечивает уникальности значений, хранимых в столбце, и не формирует автоматически значения для новых строк, вставляемых в таблицу. Для формирования уникальных значений для каждого столбца можно использовать функцию NEWID в инструкциях INSERT или определить функцию NEWID как значение по умолчанию для столбца. [ {ADD | DROP} PERSISTED ] Указывает, что свойство PERSISTED добавлено к указанному столбцу или удалено из него. Столбец должен быть вычисляемым столбцом, который задается при помощи детерминированных выражений. Для столбцов, указанных как PERSISTED, компонент Компонент Database Engine физически хранит вычисляемые значения в таблице и обновляет значения при обновлении любого столбца, от которого зависит вычисляемый столбец. Если пометить вычисляемый столбец как PERSISTED, можно создавать индексы по вычисляемым столбцам, которые заданы, являются детерминированными, но не точными выражениями. DROP NOT FOR REPLICATION Указывает, что значения в столбцах идентификаторов увеличиваются при выполнении агентами репликации операций по вставке строк. Это предложение может быть указано, только еслиcolumn_name является столбцом идентификаторов. SPARSE Указывает, что столбец является разреженным столбцом. Хранилище разреженных столбцов оптимизируется для значений NULL. Для разреженных столбцов нельзя указать параметр NOT NULL.При преобразовании столбцов из разреженных в неразреженные или из неразреженных в разреженные таблица блокируется на протяжении выполнения команды. Возможно, потребуется использование предложения REBUILD для освобождения пространства. WITH CHECK | WITH NOCHECK Указывает, удовлетворяют ли данные в таблице недавно добавленному или повторно включенному ограничению FOREIGN KEY или CHECK. Если не указано иное, для новых ограничений предполагается использовать WITH CHECK, а для повторно включенных ограничений — WITH NOCHECK. Если проверка новых ограничений CHECK или FOREIGN KEY относительно существующих данных не нужна, используйте WITH NOCHECK. За исключением редких случаев делать этого не рекомендуется. Новое ограничение будет проверяться во всех дальнейших обновлениях данных. Любые нарушения ограничений, подавляемые WITH NOCHECK во время добавления ограничения, могут вызвать сбой будущих обновлений, если они обновляют строки данными, не соответствующими ограничениям. Оптимизатор запросов не рассматривает ограничения, которые определены WITH NOCHECK. Такие ограничения не учитываются до тех пор, пока они не будут повторно включены инструкциейALTER TABLE table WITH CHECK CHECK CONSTRAINT ALL. ADD Указывает, что добавляется одно или несколько определений столбца, определений вычисляемого столбца или ограничений таблиц. DROP { [ CONSTRAINT ] constraint_name | COLUMN column_name } Указывает, что из таблицы удалено ограничение constraint_name или column_name. Может быть перечислено несколько столбцов и ограничений. Пользовательское имя ограничения или имя ограничения, предоставленное системой, можно определить с помощью запросов к представлениям каталога sys.check_constraint,sys.default_constraints, sys.key_constraints и sys.foreign_keys. Невозможно удалить ограничение PRIMARY KEY, если в таблице существует XML-индекс. Невозможно удалить столбец, если он: используется в индексе; используется в ограничениях CHECK, FOREIGN KEY, UNIQUE или PRIMARY KEY; связан со значением по умолчанию, определенным ключевым словом DEFAULT, или привязан к объекту «значение по умолчанию»; привязан к правилу. WITH <drop_clustered_constraint_option> Указывает, что установлен один или несколько параметров удаления кластеризованного ограничения. MAXDOP = max_degree_of_parallelism Переопределяет параметр конфигурации max degree of parallelism только на время операции. Дополнительные сведения см. в разделе Настройка параметра конфигурации сервера max degree of parallelism. Используйте параметр MAXDOP для ограничения числа процессоров, применяемых при выполнении параллельных планов. Максимальное число процессоров — 64. Аргумент max_degree_of_parallelism может иметь одно из следующих значений. 1 Подавляет формирование параллельных планов. >1 Ограничивает указанным значением максимальное число процессоров, используемых для параллельных операций с индексами. 0 (по умолчанию) В зависимости от текущей рабочей нагрузки системы использует реальное или меньшее число процессоров. Дополнительные сведения см. в разделе Настройка параллельных операций с индексами. ONLINE = { ON | OFF } Определяет, будут ли базовые таблицы и связанные индексы доступны для запросов и изменения данных во время операций с индексами. Значение по умолчанию — OFF. REBUILD может выполняться как операция в режиме ONLINE. ON Долгосрочные блокировки таблицы не поддерживаются во время операций с индексами. Во время главной фазы операций с индексами только блокировка с намерением совмещаемого доступа (IS) удерживается в исходной таблице. Это обеспечивает продолжение выполнения запросов или обновлений для базовых таблиц и индексов. В начале операции совмещаемая блокировка (S) исходного объекта поддерживается в течение очень короткого времени. Если создается некластеризованный индекс, то в завершение операции на короткое время запрашивается совмещаемая блокировка (S) для источника. Блокировка типа SCH-M (изменение схемы) запрашивается, когда кластеризованный индекс создается или удаляется в режиме в сети и когда происходит перестроение кластеризованного или некластеризованного индекса. При создании индекса для временной локальной таблицы параметр ONLINE не может принимать значение ON. Допустима только однопотоковая операция перестроения кучи. OFF Блокировки таблиц применяются во время выполнения операций с индексами. Блокировку изменения схемы (Sch-M) в таблице получает операция с индексами вне сети, которая создает, перестраивает или удаляет кластеризованный индекс либо перестраивает или удаляет некластеризованный индекс. Это предотвращает доступ к базовой таблице всех пользователей во время операции. Операция с индексами вне сети, создающая некластеризованный индекс, получает совмещаемую блокировку (S) в таблице. Это запрещает проводить обновления базовой таблицы, но разрешает проводить операции чтения, например инструкции SELECT. Многопотоковые операции перестроения кучи разрешены. Дополнительные сведения см. в разделе Об операциях с индексом в сети. MOVE TO { partition_scheme_name(column_name [ 1, ... n] ) | filegroup | "default" } Указывает местоположение для перемещения строк данных, находящихся в настоящее время на конечном уровне кластеризованного индекса. Таблица перемещается на новое место. Этот параметр применяется только ограничениям, образующим кластеризованный индекс. { CHECK | NOCHECK } CONSTRAINT Указывает, включено или отключено ограничение constraint_name. Данный параметр может использоваться только с ограничениями FOREIGN KEY и CHECK. Если указан параметр NOCHECK, то ограничение отключено и будущие вставки или обновления столбца не проверяются относительно условий ограничений. Невозможно отключить ограничения DEFAULT, PRIMARY KEY и UNIQUE. ALL Указывает, что все ограничения отключаются при помощи параметра NOCHECK или включаются при помощи параметра CHECK. { ENABLE | DISABLE } TRIGGER Указывает, включено или отключено ограничение trigger_name. Отключенный триггер остается определенным для таблицы; однако при выполнении инструкций INSERT, UPDATE или DELETE относительно таблицы действия в триггере не выполняются до тех пор, пока он не будет включен повторно. ALL Указывает, что все триггеры в таблице включены или отключены. trigger_name Указывает имя триггера, подлежащего включению или отключению. { ENABLE | DISABLE } CHANGE_TRACKING Указывает, разрешено или запрещено отслеживание изменений для этой таблицы. По умолчанию отслеживание изменений запрещено. Этот параметр доступен только в том случае, если отслеживание изменений разрешено для базы данных. Дополнительные сведения см. в разделе Параметры ALTER DATABASE SET (Transact-SQL). Чтобы разрешить отслеживание изменений, в таблице должен содержаться первичный ключ. WITH ( TRACK_COLUMNS_UPDATED = { ON | OFF } ) Указывает, производит ли компонент Компонент Database Engine отслеживание обновлений столбцов. Значение по умолчанию — OFF. SWITCH [ PARTITION source_partition_number_expression ] TO { schema_name ] target_table [ PARTITION target_ partition_number_expression ] Переключает блок данных одним из следующих способов. Переназначает все табличные данные как секцию в уже существующей секционированной таблице. Переключает секции из одной секционированной таблицы в другую. Переназначает все данные одной секции секционированной таблицы в уже существующую несекционированную таблицу. Если таблица table является секционированной, то необходимо указать аргумент source_partition_number_expression. Если таблица target_table секционирована, то должен быть указан аргументtarget_partition_number_expression. Если происходит переназначение данных таблицы как секции в уже существующую секционированную таблицу или переключение секции с одной секционированной таблицы на другую, то конечная секция уже должна существовать и быть пустой. Если происходит переназначение данных одной секции для формирования одиночной таблицы, то уже должна быть создана пустая целевая таблица. И исходная таблица или секция, и целевая таблица или секция должны располагаться в одной файловой группе. Соответствующие индексы или секции индексов также должны располагаться в одной и той же файловой группе. К переключаемым секциям применяются многие дополнительные ограничения. Значения table и target_table не могут быть одинаковыми. Значение target_table может быть идентификатором, состоящим из нескольких частей. Аргументы source_partition_number_expression и target_partition_number_expression являются константными выражениями, которые могут ссылаться на переменные и функции. В их число входят переменные определяемого пользователем типа и определяемые пользователем функции. Они не могут ссылаться на выражения языка Transact-SQL. Сведения об ограничении SWITCH при использовании репликации см. в разделе Репликация секционированных таблиц и индексов. SET ( FILESTREAM_ON = { partition_scheme_name | filestream_filegroup_name | "default" | "NULL" }) Указывает местоположения хранения данных FILESTREAM. Инструкция ALTER TABLE с предложением SET FILESTREAM_ON будет выполнена успешно только в том случае, если в таблице отсутствуют столбцы FILESTREAM. Добавить столбцы FILESTREAM можно с помощью второй инструкции ALTER TABLE. Если указан partition_scheme_name, то применяются правила для CREATE TABLE. Таблица должна быть уже секционирована для строк данных, а схема разделения должна использовать те же функции секционирования и столбцы, что используются в схеме секционирования FILESTREAM. Аргумент filestream_filegroup_name указывает имя файловой группы FILESTREAM. В файловой группе должен быть определен один файл для файловой группы с помощью инструкции CREATE DATABASE или ALTER DATABASE, иначе возникает ошибка. "default" указывает файловую группу FILESTREAM с заданным свойством DEFAULT. При отсутствии файловой группы FILESTREAM возникает ошибка. "NULL" указывает на удаление всех ссылок на файловые группы FILESTREAM для таблицы. Сначала должны быть удалены все столбцы FILESTREAM. Необходимо использовать инструкцию SET FILESTREAM_ON="NULL" для удаления всех данных FILESTREAM, связанных с таблицей. SET ( LOCK_ESCALATION = { AUTO | TABLE | DISABLE } ) Указывает разрешенные методы укрупнения блокировки для таблицы. AUTO Этот параметр позволяет Компонент SQL Server Database Engine выбрать гранулярность укрупнения блокировки, подходящую для данной схемы таблицы. В секционированных таблицах допускается укрупнение блокировки до секций. После укрупнения блокировки до уровня секции дальнейшее укрупнение до гранулярности TABLE выполняться не будет. Если таблица не секционирована, то блокировка будет укрупняться до гранулярности TABLE. TABLE Укрупнение блокировки будет выполняться на уровне гранулярности таблицы независимо от того, секционирована таблица или нет. Это происходит так же, как в выпуске SQL Server 2005.Значение по умолчанию равно TABLE. DISABLE В большинстве случаев предотвращает укрупнение блокировки. Блокировки уровня таблицы запрещены не полностью. Например, при сканировании таблицы, которая не имеет кластеризованного индекса на уровне изоляции SERIALIZABLE, компонент Компонент Database Engine должен установить блокировку таблицы для защиты целостности данных. REBUILD Используйте синтаксис REBUILD WITH для перестроения всей таблицы, включая все секции в секционированную таблицу. Если в таблице содержится кластеризованный индекс, то параметр REBUILD перестраивает его. REBUILD может выполняться как операция в режиме ONLINE. Используйте синтаксис REBUILD PARTITION для перестроения одной секции в секционированной таблице. PARTITION = ALL Перестраивает все секции при изменении настройки сжатия секций. REBUILD WITH ( <rebuild_option> ) Все параметры применяются к таблице с кластеризованным индексом. Если в таблице не содержится кластеризованный индекс, то на структуру кучи влияют только определенные параметры. Если определенный параметр сжатия не был указан с помощью операции REBUILD, то для секции будет использован текущий параметр сжатия. Для возврата текущего параметра выполните запрос к столбцу data_compression из представления каталога sys.partitions. Полное описание этих параметров перестроения см. в разделе index_option (Transact-SQL). DATA_COMPRESSION Задает режим сжатия данных для указанной таблицы, номера секции или диапазона секций. Ниже приведены доступные параметры. NONE Таблица или указанные секции не сжимаются. ROW Таблицы или указанные секции сжимаются, используя сжатие строк. PAGE Таблицы или указанные секции сжимаются, используя сжатие страниц. Чтобы перестроить несколько секций одновременно, см. в разделе index_option (TransactSQL). Если в таблице отсутствует кластеризованный индекс, то при изменении сжатия данных выполняется перестроение кучи и некластеризованных индексов. column_set_name XML COLUMN_SET FOR ALL_SPARSE_COLUMNS Имя набора столбцов. Набор столбцов представляет собой нетипизированное XMLпредставление, в котором все разреженные столбцы таблицы объединены в структурированные выходные данные. Набор столбцов не может быть добавлен в таблицу, если в ней содержатся разреженные столбцы. { ENABLE | DISABLE } FILETABLE_NAMESPACE Включает или выключает ограничения для таблицы FileTable, заданные системой. Может использоваться только для таблицы FileTable. SET ( FILETABLE_DIRECTORY = directory_name ) Указывает имя каталога таблицы FileTable, совместимое с Windows. Это имя должно быть уникальным среди всех имен каталогов FileTable в базе данных. Проверка уникальности не учитывает регистр символов независимо от параметров сортировки SQL. Может использоваться только для таблицы FileTable.