Как изменить значение столбца по умолчанию в SQL Server - PullRequest
2 голосов
/ 07 марта 2012

Предположительно, у меня есть таблица с именем Person, определенная так:

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, но я не уверен, что это единственный способ. Я сталкивался с этой статьей однако то, что там предлагается, похоже, не работает.

Есть идеи?

Ответы [ 3 ]

4 голосов
/ 07 марта 2012

В 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
4 голосов
/ 07 марта 2012

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

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

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

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

Работа с ограничениями по умолчанию

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

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

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

ALTER TABLE dbo.Persons DROP CONSTRAINT constraint_name;

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

0 голосов
/ 07 марта 2012

Вы можете получить имя ограничения по умолчанию, используя запрос на 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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...