2010-04-08 3 views
0

많은 비트 필드가 포함 된 매우 넓은 테이블이 있습니다. 이 비트 필드는 원래 Nullable로 설정되었습니다. 이제 우리는 nullable을 가질 수 없다는 결정을 내 렸습니다. 업데이트,SQL 2008에서 열의 null 허용 가능성 업데이트

create table MyTable( 
    ID bigint not null, 
    Name varchar(100) not null, 
    BitField1 bit null, 
    BitField2 bit null, 
    ... 
    BitFieldN bit null 
) 

그래서 난 그냥 SQL Management Studio를 통해 갔어요

create table MyTable( 
    ID bigint not null, 
    Name varchar(100) not null, 
    BitField1 bit not null, 
    BitField2 bit not null, 
    ... 
    BitFieldN bit not null 
) 

alter table MyTable add constraint DF_BitField1 default 0 for BitField1 
alter table MyTable add constraint DF_BitField2 default 0 for BitField2 
alter table MyTable add constraint DF_BitField3 default 0 for BitField3 

에 : 값이 예 또는 다른 말로 없음, 기본 번호 중 하나이며, 스키마에서 변경해야 이 모든 필드는 null이 아닌 기본값 인 0으로 변경됩니다. 그리고 업데이트하려고하면 SQL Mgmt Studio가 내부적으로 테이블을 다시 만든 다음 모든 데이터를 새 테이블에 다시 삽입하려고 시도합니다. null 값을 포함하여! 명시 적으로 null 값을 null이 허용되지 않는 열에 삽입하려고 시도하기 때문에 물론 오류를 생성합니다. 아아! 분명히

나는 형태의 N 업데이트 문을 실행할 수 있습니다 :

update MyTable set BitField1 = 0 where BitField1 is null 
update MyTable set BitField2 = 0 where BitField2 is null 

을하지만 내가 전에 말했듯이, N 필드는 거기 밖으로, 그리고 무엇보다,이 변화는 여러 동일한에게 전파한다 데이터베이스. 수동으로 구현하는 것은 매우 고통 스럽습니다.

null 값을 무시하고 null 값을 삽입하려고 할 때 기본 규칙이 시작되도록 허용하는 방법이 있습니까?

답변

2

을이 일을 다른보다 효율적인 방법이 있는지 알고 싶네 모두 테이블의 비트 열에 대해이 작업을 수행하려는 경우 커서를 사용하여 해당 열을 반복하고 스크립트를 동적으로 작성할 수 있습니다. 이것은 알렉산더의 솔루션과 비슷하지만 열에 번호가 매겨져 있지 않으면 작동한다는 점만 다릅니다. (나는 의심 스럽습니다.

DECLARE @colName sysname; 
DECLARE @sql nvarchar(max); 

DECLARE cur CURSOR LOCAL FAST_FORWARD FOR 
    SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS 
    WHERE TABLE_NAME = 'MyTable' AND DATA_TYPE = 'bit' AND IS_NULLABLE = 'YES'; 

OPEN cur; 

FETCH NEXT FROM cur INTO @colName; 
WHILE @@FETCH_STATUS = 0 
BEGIN 
    SET @sql = N'UPDATE [MyTable] SET ' + QUOTENAME(@colName) 
     + N' = 0 WHERE ' + QUOTENAME(@colName) + N' IS NULL;' 
     + N'ALTER TABLE [MyTable] ALTER COLUMN ' + QUOTENAME(@colName) 
     + N' bit NOT NULL;' 
     + N'ALTER TABLE [MyTable] ADD CONSTRAINT ' + QUOTENAME('DF_' + @colName) 
     + N' DEFAULT(0) FOR ' + QUOTENAME(@colName) + N';'; 

    EXEC (@sql); -- Replace with PRINT @sql; if you want to test first. 

    FETCH NEXT FROM cur INTO @colName; 
END 

CLOSE cur; 
DEALLOCATE cur; 
0

결국 나는 N 업데이트 문과 함께 갈 것이라고 생각합니다. 대개 복사 및 붙여 넣기가 가능한 스크립트를 작성한 다음 해당 스크립트를 해당하는 모든 데이터베이스에서 실행할 수 있습니다. 당신을 확신 경우

그럼에도 불구하고, 나는 ... 등등

0
DECLARE @command VARCHAR(8000) 
DECLARE @index int 
SET @index=0 
WHILE @index<=N DO BEGIN 
SET @[email protected]+'update MyTable SET BitField'+cast(@index as varchar(3))+' = 0 WHERE BitField'+cast(@index as varchar(3))+' IS NULL' 
EXEC(@command) 
SET @[email protected]+1 
END 

및 ...

관련 문제