Sql server 以编程方式将列设置为空

Sql server 以编程方式将列设置为空,sql-server,tsql,alter,Sql Server,Tsql,Alter,我想删除列上的notnull约束,无论其类型是什么(nvarchar,bingint,smallint) 我非常确信,可以使用sp_executesql和构建ALTER TABLE xxx ALTER COLUMN cccc type NULL语句(通过从information\u SCHEMA.COLUMNS获取列类型信息)来实现 还有其他方法吗?没有。删除NOTNULL约束的唯一方法是使用您描述的ALTER TABLE。你如何做的任何变化都会回到同一件事上。但是,如果您通过诸如SSMS之类的

我想删除列上的
notnull
约束,无论其类型是什么(
nvarchar
bingint
smallint

我非常确信,可以使用
sp_executesql
和构建
ALTER TABLE xxx ALTER COLUMN cccc type NULL
语句(通过从
information\u SCHEMA.COLUMNS
获取列类型信息)来实现


还有其他方法吗?

没有。删除NOTNULL约束的唯一方法是使用您描述的ALTER TABLE。你如何做的任何变化都会回到同一件事上。但是,如果您通过诸如SSMS之类的GUI工具执行此操作,它可能会选择删除并重新创建表(您不应该丢失任何数据,但可能需要比您想象的更长的时间)。一般来说,使用GUI工具对大表进行更改时要小心。

可能这项工作:

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