SQL Server : отбросьте ограничение по умолчанию, измените столбец и повторно создайте ограничение

#sql-server

#sql-сервер

Вопрос:

Возможно ли и как изменить столбец с ограничением по умолчанию ?

Проблема: я хочу вызвать это изменение:

Например

 ALTER TABLE MY_TABLE   ALTER COLUMN MY_COLUMN nvarchar(1024); --(was varchar)  

Но этот код создает исключение:

[S0001][5074] Строка 1: Объект «DF__МОЯ_ТАБЛИЦА __МОЙ_COL__2A563856» зависит от столбца «МОЙ СТОЛБЕЦ».

Я знаю, как искать это ограничение:

 select c.name, col.name   from sys.default_constraints c  inner join sys.columns col on col.default_object_id = c.object_id  inner join sys.objects o on o.object_id = c.parent_object_id  inner join sys.schemas s on s.schema_id = o.schema_id  where o.name = 'MY_TABLE' and col.name = 'MY_COLUMN'  

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

У меня есть 100 таких столбцов, поэтому я хочу написать какую-нибудь процедуру или функцию и вызвать ее 100 раз в сценарии для каждой таблицы и команды отдельно.

Более того, некоторые столбцы будут иметь значения по умолчанию, такие как «или» -«, или вообще не будут иметь значения по умолчанию. Важно, чтобы после выполнения сценариев все ограничения были такими же, как и до выполнения, и ни одно из них не отсутствовало.

Комментарии:

1. В качестве примечания, когда вы воссоздаете свои CONSTRAINT имена, я настоятельно рекомендую дать им значимые имена.

2. Как насчет других типов ограничений, таких как индексы и / или контрольные ограничения?

3. Просто запустите ALTER TABLE dbo.MY_TABLE DROP CONSTRAINT DF__MY_TABLE __MY_COL__2A563856; — затем ограничение будет снято, и вы сможете изменять свой столбец по своему усмотрению

4. Рассмотрите возможность использования проектов баз данных/DACPAC для такого рода развертывания; тяжелая работа по сравнению, удалению и повторному написанию сценариев там уже выполнена (хотя я не могу гарантировать, что она охватывает этот конкретный случай, но я думаю, что это так). Без этого (или интерфейсной поддержки) вам нужно немного программирования, и я не думаю, что должен говорить вам, что T-SQL не является величайшим языком программирования в мире.

5. @michealAtmi вы не можете запустить DDL в функции SQL Server.