В 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