Как я могу добавить ALTER COLUMN к NOT NULL, когда индексируется столбец

Я работаю в SQL Server 2008 R2, и я написал хранимую процедуру, которая добавляет ограничения на несколько столбцов в нескольких таблицах в моей базе данных. Тем не менее, я нахожу, что хранимая процедура терпит неудачу, потому что она не может установить конкретный столбец как первичный ключ из-за индекса в столбце. Это относится ко многим столбцам в разных таблицах.

Есть ли способ ALTER COLUMN, чтобы он был NULL, и установить его как ПЕРВИЧНЫЙ КЛЮЧ, не удаляя индекс? В противном случае, есть ли хороший способ отключить или удалить индекс, затем включить или воссоздать его после операторов ALTER COLUMN?

Спасибо всем за ваши комментарии. После некоторых исследований я смог определить, как это сделать динамически, используя точные таблицы, упомянутые @mwigdahl. См. Следующий код:

 DECLARE @indexName nvarchar(254), @tableName nvarchar(254), @indexType nvarchar(254), @columnName nvarchar(254), @isPadded integer, @ignore_dup_key integer, @allow_row_locks integer, @allow_page_locks integer, @fillFactor integer SELECT @indexName = i.name, @tableName = o.name, @indexType = i.type_desc, @columnName = co.[name], @isPadded = i.is_padded, @ignore_dup_key = i.[ignore_dup_key], @allow_row_locks = i.[allow_row_locks], @allow_page_locks = i.[allow_page_locks], @fillFactor = i.fill_factor FROM sys.indexes AS i INNER JOIN sys.objects AS o ON i.object_id = o.object_id INNER JOIN sys.index_columns ic on ic.object_id = i.object_id AND ic.index_id = i.index_id INNER JOIN sys.columns co on co.object_id = i.object_id AND co.column_id = ic.column_id WHERE i.[type] = 2 AND o.[type] = 'U' DECLARE @sql varchar(max) SET @sql = 'DROP INDEX [' + @indexName + '] ON [' + @tableName + ']' EXEC (@sql) PRINT 'Dropped Index' -- Do work here DECLARE @pad_index nvarchar(3), @ignore_dup nvarchar(3), @row_locks nvarchar(3), @page_locks nvarchar(3) IF @isPadded = 0 SET @pad_index = 'OFF' ELSE SET @pad_index = 'ON' IF @ignore_dup_key = 0 SET @ignore_dup = 'OFF' ELSE SET @ignore_dup = 'ON' IF @allow_row_locks = 0 SET @row_locks = 'OFF' ELSE SET @row_locks = 'ON' IF @allow_page_locks = 0 SET @page_locks = 'OFF' ELSE SET @page_locks = 'ON' SET @sql = 'CREATE ' + @indexType + ' INDEX [' + @indexName + '] ON [' + @tableName + ']' + '(' + '[' + @columnName + '] ASC' + ') WITH (' + 'PAD_INDEX = ' + @pad_index + ',' + 'STATISTICS_NORECOMPUTE = OFF,' + 'SORT_IN_TEMPDB = OFF,' + 'IGNORE_DUP_KEY = ' + @ignore_dup + ',' + 'DROP_EXISTING = OFF,' + 'ONLINE = OFF,' + 'ALLOW_ROW_LOCKS = ' + @row_locks + ',' + 'ALLOW_PAGE_LOCKS = ' + @page_locks + ',' + 'FILLFACTOR = ' + CONVERT(nvarchar(100),@fillFactor) + ')' + 'ON [PRIMARY]' PRINT @sql EXEC (@sql) PRINT 'Created Index' 

Я использовал функцию Script Index As в SSMS, чтобы увидеть, как будет создан индекс в T-SQL.

Затем я sys.index_columns таблицы sys.indexes и sys.index_columns чтобы определить, какие свойства были доступны.

Код показывает запрос к тем таблицам, которые сохраняют эти свойства для переменных, а затем отбрасывают и воссоздают индекс. Было несколько вариантов, которые не были доступны в тех таблицах, которые мне пришлось жестко кодировать. Кто-нибудь знает, доступны ли эти ВАРИАНТЫ где-нибудь в системной таблице?

Надеюсь, это поможет кому-то еще в будущем.

  • Первичные ключи в базе данных протоколирования
  • Как переименовать ограничение первичного ключа в SQL Server
  • Entity Framework Non Identity - не может вставить значение NULL в идентификатор столбца '
  • SQLSERVER: как изменить существующий первичный ключ таблицы int, чтобы стать столбцом идентификации?
  • Почему select SCOPE_IDENTITY () возвращает десятичное число вместо целого?
  • Есть ли способ повысить производительность при отправке большого количества идентификаторов на сервер SQL для фильтрации?
  • Могу ли я хранить старые ключи, связанные с новыми ключами при создании копии в SQL?
  • Разница между первичным ключом (кластером) и уникальным кластеризованным индексом в SQL Server
  • SQL-копирование записи без указания списка столбцов; игнорирование Identity
  • Автоматическое добавление четное и нечетное для двух баз данных для синхронизации без влияния на свойство автоматического прироста
  • Создание первичного ключа и идентификатора после загрузки данных
  • Давайте будем гением компьютера.