SQL Server 修改某个表的全部字段允许为NUll

nlojk 2008-04-25 09:53:52
1.用 SELECT * INTO TempTable FROM Table1 创建表时,新生成的表字段都是不允许为 NULL的,有什么办法可以让生成的字段都允许为NULL.
2.或者有什么办法可以修改一个表的所有字段允许为NULL值,前提是不知道这个表中所有字段的字段类型
...全文
2890 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
lhpiaoyao 2011-12-27
  • 打赏
  • 举报
回复
跟进哈,如果现有一张表,如何把现有的某列修改为允许 NULL
knowledge_Is_Life 2008-05-01
  • 打赏
  • 举报
回复
关注 接分
zjcxc 元老 2008-04-25
  • 打赏
  • 举报
回复
曾经写了一个较为通用的增加列的长度的, 写了大约 1600 行脚本
对于楼主这个, 估计应该要 500- 800 行脚本才写得出来吧

所以楼主不要抱怨答案不理想啦
zjcxc 元老 2008-04-25
  • 打赏
  • 举报
回复
表面上很简单的问题


如果要实际可行的通用脚本, 则必须考虑不少因素
1. 如果本来就允许 NULL, 则不需要设置
2. 如果列上有依赖的索引/默认值等, 则要删除, 改列后再重建(如果有外键约束则更麻烦)
3. 要准确地写出原来的列类型定义(类型名称/长度/精度/小数位)
4. 不能修改标识列

第2点最复杂, 第3点还稍好

-狙击手- 2008-04-25
  • 打赏
  • 举报
回复
nlojk 2008-04-25
  • 打赏
  • 举报
回复
谢谢!
感觉答案不是很理想
dawugui 2008-04-25
  • 打赏
  • 举报
回复
要更改的列不能是:

数据类型为 text、image、ntext 或 timestamp 的列。


表的 ROWGUIDCOL 列。


计算列或用于计算列中的列。


被复制列。


用在索引中的列,除非该列数据类型是 varchar、nvarchar 或 varbinary,数据类型没有更改,而且新列大小等于或者大于旧列大小。


用在由 CREATE STATISTICS 语句创建的统计中的列。首先用 DROP STATISTICS 语句删除统计。由查询优化器自动生成的统计会由 ALTER COLUMN 自动除去。


用在 PRIMARY KEY 或 [FOREIGN KEY] REFERENCES 约束中的列。


用在 CHECK 或 UNIQUE 约束中的列,除非用在 CHECK 或 UNIQUE 约束中的可变长度列的长度允许更改。


有相关联的默认值的列,除非在不更改数据类型的情况下允许更改列的长度、精度或小数位数。
有些数据类型的更改可能导致数据的更改。例如,将数据类型为 nchar 或 nvarchar 的列更改为 char 或 varchar 类型,将导致扩展字符的转换。有关更多信息,请参见 CAST 和 CONVERT。降低列的精度和小数位数可能导致数据截断。

cylot 2008-04-25
  • 打赏
  • 举报
回复
以下提供一个修改ntext列的例子:
Alter Table tbl Add newcol ntext null
go
update tbl set newcol=col
go
EXEC sp_rename 'tbl.col', 'oldcol', 'COLUMN'
go
EXEC sp_rename 'tbl.newcol', 'col', 'COLUMN'
go
alter table tbl drop column oldcol
go
以上通过新增一列替换旧的列方法实现了将一个不允许为空的ntext修改为允许为空的ntext列(注意:以上的go不能缺少).
数据先导入临时表
dawugui 2008-04-25
  • 打赏
  • 举报
回复
create table tb(a int not null, b int not null, c varchar(10) not null)
go

select 执行语句 = 'ALTER TABLE tb alter column ' + a.name + ' ' + b.name + ' null'
FROM syscolumns a left join systypes b on a.xusertype=b.xusertype inner join sysobjects d on a.id=d.id and d.name='tb'

go

drop table tb

/*
执行语句
---------------------------------------
ALTER TABLE tb alter column a int null
ALTER TABLE tb alter column b int null
ALTER TABLE tb alter column c varchar null

(所影响的行数为 3 行)
*/
nlojk 2008-04-25
  • 打赏
  • 举报
回复
Table1为外部数据表 FoxPro的DBF 而且是客户数据 不能更改 从从系统表syscolumns及systypes中查出字段的类型然后更改太麻烦了吧
青锋-SS 2008-04-25
  • 打赏
  • 举报
回复
另外:可以从系统表syscolumns及systypes中查出字段的类型.
cylot 2008-04-25
  • 打赏
  • 举报
回复
把Table1 的字段改掉可否
青锋-SS 2008-04-25
  • 打赏
  • 举报
回复
[Quote=引用楼主 nlojk 的帖子:]
1.用 SELECT * INTO TempTable FROM Table1 创建表时,新生成的表字段都是不允许为 NULL的,有什么办法可以让生成的字段都允许为NULL.
[/Quote]原因是table1的所有字段不允许为空,如果table1的字段允许空的话,生成的临时表也允许为空.
青锋-SS 2008-04-25
  • 打赏
  • 举报
回复
[Quote=引用楼主 nlojk 的帖子:]
1.用 SELECT * INTO TempTable FROM Table1 创建表时,新生成的表字段都是不允许为 NULL的,有什么办法可以让生成的字段都允许为NULL.
2.或者有什么办法可以修改一个表的所有字段允许为NULL值,前提是不知道这个表中所有字段的字段类型
[/Quote]晕,没看清题目.
青锋-SS 2008-04-25
  • 打赏
  • 举报
回复
create table tb(id int,name varchar not null)
insert into tb values(1,'a')
alter table tb alter column name varchar(2) null
insert into tb(id) values(2)
select * from tb
drop table tb


id name
----------- ----
1 a
2 NULL

(2 行受影响)

青锋-SS 2008-04-25
  • 打赏
  • 举报
回复
alter table alter column colname datatyep null
ojuju10 2008-04-25
  • 打赏
  • 举报
回复

2.或者有什么办法可以修改一个表的所有字段允许为NULL值,前提是不知道这个表中所有字段的字段类型
-----------
写个通用的比较麻烦,将字段不允许为null,修改成运行为Null,必须要知道字段的类型和长度或者默认长度,

字段类型有的是固定的长度,例如int,createtime,float等

有的是不固定的,需要查询字段长度,例如:varchar(),char()等

所以如果数据表不是很多的情况下,最好手工弄下!

ojuju10 2008-04-25
  • 打赏
  • 举报
回复

用脚本修改Table1里面的字段不为null,都修改为null

2.或者有什么办法可以修改一个表的所有字段允许为NULL值,前提是不知道这个表中所有字段的字段类型
---------
这个可以查询系统表后,用游标去修改所有的表允许为null

34,575

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧