2009-12-14 5 views
1

데이터베이스에 원래 smalldatetime으로 생성 된 열이 많으며 실제로는 datetime 일 필요가 있습니다. 이 컬럼의 대부분은 DDL로 만든 : 컬럼의 유형을 변경하기 위해, 내가 먼저 기본을 삭제하고 다음을 변경 한 후 기본을 다시 만들 필요가 있다는 것을 의미smalldatetime 열을 기본값으로 datetime으로 변경하려면 어떻게해야합니까?

[columnname] smalldatetime not null default getdate() 

을 ....

물론 DDL에서 기본값 이름을 지정하지 않았기 때문에 모든 열의 기본값은 DF__CaseLock__CaseCo__182C9B23입니다. 그리고 내 응용 프로그램이 데이터베이스를 만들 때 스크립트를 실행하여 데이터베이스를 만듭니다. 따라서 내 고객 데이터베이스의 기본 이름이 내 이름과 다른 (추측하고 있지만 확인하지 않았습니다).

기본 제약 조건의 이름을 알고 있더라도 삭제 한 후에 다시 추가 구문을 알아낼 수 없습니다. 실제로, 그것은 내게 그것이 가능하다는 사실을 알지 못합니다. 기존 컬럼에 디폴트 제한을 추가합니다. 내가 constraint_name이 무엇인지 알고 있다면 난의 열을 삭제할 수 없기 때문에 단지 나는 단지 그 스크립트를 작성할 수 있습니다 ...

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 

:

내가이해야 할 것은이 같은 것 같습니다 제약에서 참조된다.

정말 그렇게 어렵습니까?

답변

4

는이 같은 기본 제약 조건을 추가 할 수 있습니다

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

당신은 기존의 제약을 찾기 위해 SYS 테이블을 심문 할 수 있습니다. 다시 추가 할 때 명시 적 이름을 제공해야합니다. Here's a blog post에는 명명되지 않은 제약 조건을 삭제/추가하는 데 사용되는 여러 스크립트가 있습니다. 희망이 도움이됩니다!

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

모든 기본 제약 조건에 대한 해당 쿼리 반환 한 행이'my_table'에 정의하지 않을까요? –

+0

아, 죄송합니다. 나는 당신에게 여러 가지 기본 제약이 있음을 깨닫지 못했다. 잠시 후에 편집하겠습니다. – Paul

+0

OK ... 완료되었습니다. – Paul

관련 문제