Colonne définie par programme, nullable

Je voudrais enlever la contrainte not null sur une colonne, quel que soit son type ( nvarchar , bingint , smallint ).

Je suis assez sûr qu'il peut être réalisé en utilisant sp_executesql et en construisant l' sp_executesql ALTER TABLE xxx ALTER COLUMN cccc type NULL (en obtenant des informations de type colonne de INFORMATION_SCHEMA.COLUMNS ).

Est-ce qu'il y a un autre moyen?

Non. La seule façon de supprimer la contrainte NOT NULL est d'utiliser ALTER TABLE comme vous le décrivez. Toute variation sur la façon dont vous le faites reviendra à la même chose. Cependant, si vous le faites via un outil graphique tel que SSMS, il peut choisir de supprimer et de recréer la table (vous ne devriez pas perdre de données mais cela peut prendre beaucoup plus de time que vous ne l'imaginiez). En général, veillez à utiliser les outils GUI pour apporter des modifications aux grandes tables.

peut-être ce travail:

  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