1

私のデータベースには、最初は として作成された列がいくつ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...制約で参照されている列を削除できないため、何がわかっている場合にのみ、そのスクリプトを作成できます。

これってそんなに大変ですか?

4

2 に答える 2

4

次のようなデフォルトの制約を追加できます。

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

sys テーブルを調べて、既存の制約を見つけることができます。それらを再度追加するときは、明示的な名前を指定する必要があります。 これは、名前のない制約の削除/追加を処理するための多数のスクリプトを含むブログ投稿です。それが役立つことを願っています!

于 2009-12-14T21:02:32.363 に答える
1

残念ながら、動的 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
于 2009-12-14T21:20:14.697 に答える