2015-03-03 2 views
1

Я хотел бы удалить ограничение not null на столбец независимо от его типа (nvarchar, bingint, smallint).Программно задан столбец nullable

Я уверен, что это может быть достигнуто с помощью sp_executesql и построения инструкции ALTER TABLE xxx ALTER COLUMN cccc type NULL (путем получения информации типа столбца от INFORMATION_SCHEMA.COLUMNS).

Есть ли другой способ?

ответ

0
create procedure sp_RemoveNotNullConstraint 
(
    @tableName nvarchar(255), 
    @columnName nvarchar(255) 
) 
as 
begin 

    declare @dataType nvarchar(255) 
    declare @sql nvarchar(max); 

    select @dataType = 
     case 
      when C.CHARACTER_MAXIMUM_LENGTH is not null 
       then C.DATA_TYPE + '(' + CAST(C.CHARACTER_MAXIMUM_LENGTH as nvarchar(255)) + ')' 
      else C.DATA_TYPE 
     end 
    from INFORMATION_SCHEMA.COLUMNS C 
    where C.TABLE_NAME = @tableName AND C.COLUMN_NAME = @columnName 

    set @sql = 'ALTER TABLE ' + @tableName + ' ALTER COLUMN ' + @columnName + ' ' + @dataType + ' NULL;'; 
    exec sp_executesql @sql; 

end 
go 
2

№. Единственный способ удалить ограничение NOT NULL - это использовать ALTER TABLE, как вы описываете. Любая вариация того, как вы это сделаете, вернется к тому же. Однако, если вы сделаете это с помощью инструмента GUI, такого как SSMS, то может выбрать, чтобы удалить и повторно создать таблицу (вы не должны терять данные, но это может занять гораздо больше времени, чем вы предполагали). В общем, будьте осторожны с использованием инструментов GUI для внесения изменений в большие таблицы.

0

может быть, эта работа:

Declare @TableName As nvarchar(250) 
      ,@ColumnName As nvarchar(250) 
      ,@TypeName As nvarchar(250) 

    Declare Cr Cursor for 

    Select Top 10 obj.name As TableName ,clm.name As ColumnName ,typ.name As TypeName 
    from sys.Columns As clm 
    inner join sys.Objects As obj On obj.object_Id = clm.object_id 
    inner join sys.types As typ On typ.system_type_id = clm.system_type_id 
    where obj.type = N'U' 
    And typ.system_type_id in (52 ,127 ,167) 
    open Cr 
    fetch next from Cr into @TableName ,@ColumnName , @TypeName 

    while(@@fetch_status = 0) 
    begin 

     Declare @StrSQL nvarchar(max) 

     Set @StrSQL = N' Alter Table ' + @TableName + N' Alter Column ' + @ColumnName + N' ' + @TypeName 
     Print @StrSQL 

    fetch next from Cr into @TableName ,@ColumnName , @TypeName 

    End 

    Close CR 
    Deallocate CR