2012-03-07 7 views
1

Supposedly У меня есть таблица с именем Person определены следующим образом:Как изменить значение по умолчанию для столбца в SQL Server

CREATE TABLE Persons 
(
    P_Id uniqueidentifier Default newsequentialid() NOT NULL, 
    LastName varchar(255) NOT NULL, 
    FirstName varchar(255), 
    Address varchar(255), 
    City varchar(255) DEFAULT 'Sandnes' 
) 

Как я могу удалить значение по умолчанию для этого столбца с помощью запроса SQL? Кроме того, как я могу добавить его, если его нет для начала. Я знаю, что его можно добавить, изменив таблицу и добавив ограничение по столбцу P_Id, но я не уверен, что это единственный способ. Я столкнулся с this article, однако предлагаемое там, похоже, действительно не работает.

Любые идеи?

+0

Вы, безусловно, будете «ALTER» своим столом, так как это единственный способ модифицировать его структуру. –

+0

Для какой колонки? У вас есть два столбца со значениями по умолчанию. Этот подход будет одним и тем же, просто хочу убедиться, что явные примеры относятся к столбцу, о котором вы говорите. –

ответ

4

В 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 
+0

Спасибо. Это именно то, что я искал. Спасибо за тщательное объяснение. – ScorpiAS

+1

Очевидно, что я потратил слишком много времени на исправление неустановленных значений по умолчанию. –

+0

См. Также http://stackoverflow.com/questions/1397440/what-is-the-purpose-of-constraint-naming/1397493#1397493 –

4

Самый простой способ определить синтаксис для уже существующей таблицы - это щелкнуть правой кнопкой мыши по таблице в Обозревателе объектов и выбрать Script As > Create To > New Window. Это поможет вам сгенерировать скрипт для аналогичной таблицы, если вам нужно создать его.

Я не знаю, как это сделать для ALTER. В вашем случае, если это по умолчанию ограничение не было на этой колонке, я бы сказал:

ALTER TABLE dbo.Persons ADD CONSTRAINT dfCity DEFAULT ('Sandnes') FOR City; 

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

Working with Default Constraints

И конечно ALTER TABLE тема в Books Online:

http://msdn.microsoft.com/en-us/library/ms190273.aspx

Если вы хотите удалить ограничение, сначала нужно найти имя, а затем вы можете сказать:

ALTER TABLE dbo.Persons DROP CONSTRAINT constraint_name; 

@Calin отправил запрос, который получит имя ограничения, но я не думаю, что вы можете передать @constraintname в инструкцию ALTER TABLE таким образом.

+0

отлично. он работал .. полезно –

0

Вы можете получить имя ограничения по умолчанию, используя запрос на sys.default_constraints, а затем бросить его, изменяя таблицу:

declare @constraintname varchar(128); 
select @constraintname = d.name 
from sys.default_constraints d 
join sys.columns c ON c.column_id = d.parent_column_id AND c.object_id = d.parent_object_id 
join sys.objects o ON o.object_id = d.parent_object_id 
WHERE o.name = 'Persons' AND c.name = 'P_Id'; 

declare @sql nvarchar(256); 
set @sql = 'ALTER TABLE Persons DROP CONSTRAINT ' + @constraintName; 
EXEC sp_executesql @sql; 
+0

Этот синтаксис тоже не работает. Вы не можете создать команду при вызове 'sp_executesql', вам нужно сначала создать команду. Вы попробовали? Кроме того, 'varchar (max)', действительно? –

+0

Отредактировано. Размер 128 - это намек, взятый из другого вопроса SO http://stackoverflow.com/questions/5808332/sql-server-maximum-character-length-of-object-names –

+0

По-прежнему не работает. Настоятельно рекомендуем попробовать свой код перед публикацией. 'sp_executesql' требует команды' nvarchar'. –

Смежные вопросы