В SQL Server, по умолчанию определяются как ограничения, связанные с определенным столбец в Таблица. Все ограничения присваиваются имени; это важно, поскольку после создания ограничения, если вы хотите его изменить, вам нужно ссылаться на это имя. (И я буду смотреть на этот вопрос, чтобы увидеть, если я ошибаюсь.)
На основании этой таблицы выборки:
CREATE TABLE MyTable
(
MyTableId int not null
,SomeData varchar(50) not null default 'Foo'
,MoreData datetime not null default CURRENT_TIMESTAMP
)
Шаг 1: Определите, если ограничение существует на колонке. Несколько способов сделать это, все из которых связаны с системными представлениями и/или функциями метаданных. Вот быстрая один, где «MyTable» и «SomeData» может быть установлена в качестве параметров:
SELECT name
from sys.default_constraints
where parent_object_id = object_id('MyTable')
and parent_column_id = columnproperty(object_id('MyTable'), 'SomeData', 'ColumnId')
Попробуйте, и вы увидите, что имя генерируется случайным образом, по существу, болтовня.Для того, чтобы определить, если по умолчанию существует на колонке, вы можете сделать:
IF exists (select name
from sys.default_constraints
where parent_object_id = object_id('MyTable')
and parent_column_id = columnproperty(object_id('MyTable'), 'SomeData', 'ColumnId'))
PRINT 'Default found'
ELSE
PRINT 'NoDefault'
Чтобы удалить существующий по умолчанию, когда вы не знаете имя, вы должны построить динамический SQL. (Этот код в указанной статье не так, и явно никогда не испытывали.) @ Călin делает это немного по-другому, чем я хотел бы сделать это, но идея та же:
DECLARE @Command nvarchar(max)
SELECT @Command = 'ALTER TABLE MyTable drop constraint ' + name
from sys.default_constraints
where parent_object_id = object_id('MyTable')
and parent_column_id = columnproperty(object_id('MyTable'), 'SomeData', 'ColumnId')
IF @Command is not null
EXECUTE sp_executeSQL @Command
(с проверкой ошибок, параметры для таблицы и и столбца проверяются, и так далее)
Наконец, вы можете избежать большинства это, называя по умолчанию при создании ограничения, например, так:.
CREATE TABLE MyTable
(
MyTableId int not null
,SomeData varchar(50) not null
constraint DF_MyTable__SomeData default 'Foo'
,MoreData datetime not null
constraint DF_MyTable__MoreData default CURRENT_TIMESTAMP
)
Или вот так:
IF not exists (select name
from sys.default_constraints
where parent_object_id = object_id('MyTable')
and parent_column_id = columnproperty(object_id('MyTable'), 'SomeData', 'ColumnId'))
ALTER TABLE MyTable
add constraint DF_MyTable__SomeData
default 'Foo' for SomeData
Вы, безусловно, будете «ALTER» своим столом, так как это единственный способ модифицировать его структуру. –
Для какой колонки? У вас есть два столбца со значениями по умолчанию. Этот подход будет одним и тем же, просто хочу убедиться, что явные примеры относятся к столбцу, о котором вы говорите. –