日期:2014-05-17  浏览次数:20419 次

如何批量修改表字段 把允许为空修改为 不允许为空
有6张表,
每张表都有超过50个字段,
请教如何批量把他们设置为 不允许为空。
------最佳解决方案--------------------
本帖最后由 roy_88 于 2011-11-21 18:42:55 编辑 更新方法,如果字段已存在null,需要更新后再改
DECLARE @s NVARCHAR(4000)
SET @s=''
SELECT 
@s=@s+'Alter TABLE [表名] alter column '+Name+' '+TYPE_NAME(user_type_id)+case
when user_type_id in(34,35,36,48,52,56,58,59,60,61,62,98,99,104,122,127,189,241,256,241) then '' 
when user_type_id in(106,108) then '('+rtrim(Precision)+','+rtrim(Scale)+')'
when user_type_id in (231,239) then  case when  max_length=-1 then '(max)' else '('+rtrim(max_length/2)+')' end
when max_length=-1 then '(Max)'
else '('+rtrim(max_length)+')' END+' not null;'
FROM sys.columns  
WHERE is_nullable=0 AND object_id=object_id('表名')
EXEC(@s)

------其他解决方案--------------------
以前的列里存在NULL的话
就更加烦了
先把之前的NULL update掉
楼主要淡定 慢慢搞
------其他解决方案--------------------
1.查询系统视图,sys.tables,sys.columns,sys.types得到表名,字段名,数据类型。
2.把1中的数据插入临时表,用游标遍历
3.在游标中拼动sql(alter table @tb_name alter @col_name @data_type not null)并执行
------其他解决方案--------------------
同上,大概如下
select 'alter table t alter column ' +name+' varchar(20) not null' ,* from syscolumns where OBJECT_ID('t')=id and isnullable=1
------其他解决方案--------------------
关联系统表,游标遍历。
不过对此种设计表示不敢恭维
------其他解决方案--------------------
查系统表
拼alter table...
  alter column
语句
其他也没什么快捷的

------其他解决方案--------------------
在vs 中将几张表的定义打开,去掉“允许空”即可。比写语句快得多!

------其他解决方案--------------------
引用:
以前的列里存在NULL的话
就更加烦了
先把之前的NULL update掉
楼主要淡定 慢慢搞



------其他解决方案--------------------
系统表遍历,最好加个默认值,否则无法修改
------其他解决方案--------------------
这种操作不可取,用自动的方式更不好.

因为,你不知道现有的那么多值得用程序来批量更改的表中,有没有一个行中的一个列值它就是NULL,如果有,那你的程序肯定会出错.

建议还是在表设计器中一个个改.
------其他解决方案--------------------
淡定哟