Программно установленный столбец обнуляемый
Я хотел бы удалить not null
ограничение на столбец, независимо от его типа (nvarchar
, bingint
, smallint
).
Я уверен, что это может быть достигнуто с помощью sp_executesql
и строит ALTER TABLE xxx ALTER COLUMN cccc type NULL
заявление (путем получения информации о типе столбца из INFORMATION_SCHEMA.COLUMNS
).
Есть ли другой путь?
3 ответа
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 - использовать ALTER TABLE, как вы описали. Любое изменение в том, как вы это сделаете, вернется к тому же самому. Однако, если вы сделаете это с помощью инструмента с графическим интерфейсом, такого как SSMS, он может удалить и заново создать таблицу (вы не должны терять какие-либо данные, но это может занять гораздо больше времени, чем вы предполагали). В общем, будьте осторожны с использованием инструментов 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