如何用SQL语句把一张表内的所有NULL字段全部替换掉??

时间:2021-09-20 15:10:24
比如一张表里每个字段每条记录里都包含有若干个NULL值,怎么样才能一次性把表中的NULL都替换成"1"??求教~~~

9 个解决方案

#1


Update TableName
set col1=isnull(col1,1),
    col2=isnull(col2,1),
    .....

#2


1楼的不错

#3


这样写的话会写死的,有500个列怎么办?好象没有什么好的方法可以简单的替换掉…………

#4


用动态SQL语句,循环所有的用户表的每一列,更新凡是NULL的都更新为1。

#5


--所有用户表信息
select * from information_schema.columns

#6




动态sql语句基本语法 
1 :普通SQL语句可以用Exec执行 

eg:   Select * from tableName 
         Exec('select * from tableName') 
         Exec sp_executesql N'select * from tableName'    -- 请注意字符串前一定要加N 

2:字段名,表名,数据库名之类作为变量时,必须用动态SQL 

eg:   
declare @fname varchar(20) 
set @fname = 'FiledName' 
Select @fname from tableName              -- 错误,不会提示错误,但结果为固定值FiledName,并非所要。 
Exec('select ' + @fname + ' from tableName')     -- 请注意 加号前后的 单引号的边上加空格 

当然将字符串改成变量的形式也可 
declare @fname varchar(20) 
set @fname = 'FiledName' --设置字段名 

declare @s varchar(1000) 
set @s = 'select ' + @fname + ' from tableName' 
Exec(@s)                -- 成功 
exec sp_executesql @s   -- 此句会报错 



declare @s Nvarchar(1000)  -- 注意此处改为nvarchar(1000) 
set @s = 'select ' + @fname + ' from tableName' 
Exec(@s)                -- 成功     
exec sp_executesql @s   -- 此句正确 

3. 输出参数 
declare @num int, 
        @sqls nvarchar(4000) 
set @sqls='select count(*) from tableName' 
exec(@sqls) 

--如何将exec执行结果放入变量中? 

declare @num int, @sqls nvarchar(4000) 
set @sqls='select @a=count(*) from tableName ' 
exec sp_executesql @sqls,N'@a int output',@num output 
select @num 

#7


declare @sql varchar(8000)
select @sql=''
select @sql=','+name+'=isnull('+name+',1)'+@sql from syscolumns where id=object_id('TableName')
select @sql='Update TableName Set '+stuff(@sql,1,1,'')
print @sql

--要是有500个字段,lz应该检讨一下表的设计问题了

#8


人懒的话就不要写SQL了。写几个ISNULL也嫌烦。

还要从syscolumns读字段名,再组成动态语句来更新, 不知道哪个更烦。
水平高就不说了,水平过低的话,估计这段执行完成功能的批语句都写的你恨自己为什么生在中国,混口饭吃这么难。

#9


--------------------------------------------------------------
您好,我们是“2006中国杰出数据库工程师评选”活动组委会。
您的帖子已经被我们转载到本次评选官方网站的“专家在线答疑”区。
http://www.bestdba.cn/match_discussion.aspx

在那里,进入本次评选复选的90位数据库工程师将与您展开积极的互动。
一方面,他们会为您的问题提供满意的答案,
另一方面,也邀请您为他们投上宝贵的选票。

2006-7-8 ~ 2006-7-25日,每天我们将从当天参与"有奖投票"的网友
中抽取3名幸运者,赠送由IBM提供的精美礼品一份!

此外,您还可以在“专家在线答疑”区提出新的问题并参与讨论。

您的帖子位于:
http://www.bestdba.cn/match_discussion3.aspx?pointid=7&pointid2=1&pointid3=5

非常感谢您对本次活动的支持!
--------------------------------------------------------------

#1


Update TableName
set col1=isnull(col1,1),
    col2=isnull(col2,1),
    .....

#2


1楼的不错

#3


这样写的话会写死的,有500个列怎么办?好象没有什么好的方法可以简单的替换掉…………

#4


用动态SQL语句,循环所有的用户表的每一列,更新凡是NULL的都更新为1。

#5


--所有用户表信息
select * from information_schema.columns

#6




动态sql语句基本语法 
1 :普通SQL语句可以用Exec执行 

eg:   Select * from tableName 
         Exec('select * from tableName') 
         Exec sp_executesql N'select * from tableName'    -- 请注意字符串前一定要加N 

2:字段名,表名,数据库名之类作为变量时,必须用动态SQL 

eg:   
declare @fname varchar(20) 
set @fname = 'FiledName' 
Select @fname from tableName              -- 错误,不会提示错误,但结果为固定值FiledName,并非所要。 
Exec('select ' + @fname + ' from tableName')     -- 请注意 加号前后的 单引号的边上加空格 

当然将字符串改成变量的形式也可 
declare @fname varchar(20) 
set @fname = 'FiledName' --设置字段名 

declare @s varchar(1000) 
set @s = 'select ' + @fname + ' from tableName' 
Exec(@s)                -- 成功 
exec sp_executesql @s   -- 此句会报错 



declare @s Nvarchar(1000)  -- 注意此处改为nvarchar(1000) 
set @s = 'select ' + @fname + ' from tableName' 
Exec(@s)                -- 成功     
exec sp_executesql @s   -- 此句正确 

3. 输出参数 
declare @num int, 
        @sqls nvarchar(4000) 
set @sqls='select count(*) from tableName' 
exec(@sqls) 

--如何将exec执行结果放入变量中? 

declare @num int, @sqls nvarchar(4000) 
set @sqls='select @a=count(*) from tableName ' 
exec sp_executesql @sqls,N'@a int output',@num output 
select @num 

#7


declare @sql varchar(8000)
select @sql=''
select @sql=','+name+'=isnull('+name+',1)'+@sql from syscolumns where id=object_id('TableName')
select @sql='Update TableName Set '+stuff(@sql,1,1,'')
print @sql

--要是有500个字段,lz应该检讨一下表的设计问题了

#8


人懒的话就不要写SQL了。写几个ISNULL也嫌烦。

还要从syscolumns读字段名,再组成动态语句来更新, 不知道哪个更烦。
水平高就不说了,水平过低的话,估计这段执行完成功能的批语句都写的你恨自己为什么生在中国,混口饭吃这么难。

#9


--------------------------------------------------------------
您好,我们是“2006中国杰出数据库工程师评选”活动组委会。
您的帖子已经被我们转载到本次评选官方网站的“专家在线答疑”区。
http://www.bestdba.cn/match_discussion.aspx

在那里,进入本次评选复选的90位数据库工程师将与您展开积极的互动。
一方面,他们会为您的问题提供满意的答案,
另一方面,也邀请您为他们投上宝贵的选票。

2006-7-8 ~ 2006-7-25日,每天我们将从当天参与"有奖投票"的网友
中抽取3名幸运者,赠送由IBM提供的精美礼品一份!

此外,您还可以在“专家在线答疑”区提出新的问题并参与讨论。

您的帖子位于:
http://www.bestdba.cn/match_discussion3.aspx?pointid=7&pointid2=1&pointid3=5

非常感谢您对本次活动的支持!
--------------------------------------------------------------