以编程方式设置列可为空
Programmatically set column nullable
我想删除列上的 not null
约束,无论其类型是 (nvarchar
、bingint
、smallint
)。
我很确定可以使用 sp_executesql
并构建 ALTER TABLE xxx ALTER COLUMN cccc type NULL
语句(通过从 INFORMATION_SCHEMA.COLUMNS
获取列类型信息)来实现。
还有其他方法吗?
没有。删除 NOT NULL 约束的唯一方法是按照您的描述使用 ALTER TABLE 。你如何做的任何变化都会回到同一件事。但是,如果您通过 GUI 工具(例如 SSMS)执行此操作,它 可能 选择删除并重新创建 table(您不应丢失任何数据,但可能需要比你想象的要长得多)。通常要小心使用 GUI 工具对大 tables 进行更改。
也许这项工作:
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
我想删除列上的 not null
约束,无论其类型是 (nvarchar
、bingint
、smallint
)。
我很确定可以使用 sp_executesql
并构建 ALTER TABLE xxx ALTER COLUMN cccc type NULL
语句(通过从 INFORMATION_SCHEMA.COLUMNS
获取列类型信息)来实现。
还有其他方法吗?
没有。删除 NOT NULL 约束的唯一方法是按照您的描述使用 ALTER TABLE 。你如何做的任何变化都会回到同一件事。但是,如果您通过 GUI 工具(例如 SSMS)执行此操作,它 可能 选择删除并重新创建 table(您不应丢失任何数据,但可能需要比你想象的要长得多)。通常要小心使用 GUI 工具对大 tables 进行更改。
也许这项工作:
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