Как изменить столбец smalldatetime со значением по умолчанию datetime? - PullRequest
1 голос
/ 14 декабря 2009

У меня есть ряд столбцов в моей базе данных, которые изначально были созданы как smalldatetime, и это действительно должно быть datetime. Многие из этих столбцов были созданы с помощью DDL:

[columnname] smalldatetime not null default getdate()

... это означает, что для того, чтобы изменить тип столбца, я сначала должен удалить значение по умолчанию, а затем заново создать значение по умолчанию после его изменения.

Конечно, я не указал имя по умолчанию в DDL, поэтому все столбцы имеют значения по умолчанию с именами, такими как DF__CaseLock__CaseCo__182C9B23. И когда мое приложение создает свою базу данных, оно делает это, выполняя сценарий, поэтому имена по умолчанию в базах данных моих клиентов (я полагаю; я не проверял это) отличаются от их имен в моих.

И даже если я знаю имя ограничения по умолчанию, я не могу понять синтаксис для добавления его обратно после его удаления. На самом деле, мне не ясно, что возможно добавить ограничение по умолчанию к существующему столбцу.

Похоже, что я должен сделать что-то вроде этого:

declare @t table (id int not null primary key, date smalldatetime null)
insert into @t (id, date)
    select id, date_column from my_table
drop constraint constraint_name
alter table my_table drop column date_column;
alter table my_table add date_column datetime default getdate()
update my_table set date_column = t.date FROM my_table m JOIN @t t ON m.id = t.ID

... только я могу написать этот скрипт, только если знаю, что такое constraint_name, потому что я не могу удалить столбец, на который ссылается ограничение.

Неужели это так сложно?

Ответы [ 2 ]

4 голосов
/ 15 декабря 2009

Вы можете добавить ограничение по умолчанию, например:

ALTER TABLE TableName
ADD CONSTRAINT DF_DefaultName DEFAULT 'Default Value' FOR ColumnName

Вы можете опросить таблицы sys, чтобы найти существующие ограничения. Когда вы добавляете их обратно, вы должны предоставить им явное имя. Вот запись в блоге , в которой есть несколько сценариев для удаления / добавления безымянных ограничений. Надеюсь, это поможет!

1 голос
/ 15 декабря 2009

Боюсь, вам придется прибегнуть к динамическому SQL.

Имейте в виду, что любые данные, которые ранее были установлены по умолчанию, останутся.

DECLARE @query varchar(256)

SET @query = (
    SELECT 'ALTER TABLE my_table DROP CONSTRAINT ' + d.name 
    FROM sysobjects d
        INNER JOIN sysobjects t ON t.id = d.parent_obj
    WHERE d.type = 'D'
        AND t.name = 'my_table')

EXEC(@query)

ALTER TABLE my_table
ADD CONSTRAINT DF_date_column default getdate() for date_column

РЕДАКТИРОВАТЬ: Где несколько столбцов по умолчанию существует в my_table:

CREATE TABLE #Defaults (
    strName varchar(256) PRIMARY KEY
)

INSERT INTO #Defaults (strName)
SELECT d.name 
FROM sysobjects d
    INNER JOIN sysobjects t ON t.id = d.parent_obj
WHERE d.type = 'D'
    AND t.name = 'my_table'

DECLARE @name varchar(256), @query varchar(256)

SET @name = (SELECT TOP 1 strName FROM #Defaults)

WHILE @name IS NOT NULL
BEGIN        
    SET @query = 'ALTER TABLE my_table DROP CONSTRAINT ' + @name

    EXEC(@query)

    DELETE FROM #Defaults 
    WHERE strName = @name

    SET @name = (SELECT TOP 1 strName FROM #Defaults)
END

ALTER TABLE my_table
ADD CONSTRAINT DF_date_column1 default getdate() for date_column1

ALTER TABLE my_table
ADD CONSTRAINT DF_date_column2 default getdate() for date_column2

DROP TABLE #Defaults
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...