您的位置:程序门 -> ms-sql server -> 应用实例



最难的数据表字段更新问题


[收藏此页] [打印本页]选择字色:背景色:字体:[][][]


最难的数据表字段更新问题[已结贴,结贴人:hnsongbiao]
发表于:2007-12-06 19:24:07 楼主
现有表ta,ta中有很多字段,另有一表tb,表tb中的字段与表ta中的字段部分相同,也就是表tb中的字段在表ta中都有,表ta中的字段在表tb中不一定有,另两个表有相同的id  

现在表tb的数据是最新的,要用tb的数据去更新表ta的数据,应该如何写sql?  


现在我的想法是先要判断tb和ta有哪些相同字段,用tb的字段依次去判断是否在ta中有相同字段,然后再更新,  

取出tb的字段,判断在ta中的存在性,若存在,按照id更新,  

能否写出动态sql语句呢?  

这个问题非常难啊!!!
发表于:2007-12-06 19:34:521楼 得分:0
已经回复过了呀

update   a
set   a.col   =   b.col
from   tablea   a
right   join   tableb   b
on   a.id   =   b.id


动态可以 的呀
发表于:2007-12-06 19:39:412楼 得分:0
不行啊     a.col=b.col       这是什么意思啊?
发表于:2007-12-06 19:40:133楼 得分:0
列名   'col'   无效。
发表于:2007-12-06 19:46:194楼 得分:0
sql code
declare @i int select @i=count*) from tb declare @sql nvarchar2000) set @sql = '' while @i>0 begin @sql+='if exists(select 1 from ta where 字段1='+char39)+select top (i) 字段1 from tb+char39)+') and 其他字段的条件' @sql+=' update 更新语句,简单就不写了 go' set @i=@i-1 end
发表于:2007-12-06 19:49:465楼 得分:0
update       a  
set       a.col       =       b.col  
from       tablea       a  
right       join       tableb       b  
on       a.id       =       b.id  


  a.col       =       b.col   这句能否解释一下啊
发表于:2007-12-06 19:50:216楼 得分:10
sql code
create table ta(id int,col1 int, col2 int) create table tb(id int,col1 int) insert ta select 1,1,1 insert ta select 2,3,1 insert tb select 1,3 insert tb select 2,1 go declare @s varchar8000) select @s = 'update a set ' select @s = @s + 'a.['+colname+']= b.['+colname+']' fromselect cast(b.name as varchar)as colname from sysobjects a,syscolumns b where a.id = object_id'ta') and a.id = b.id and existsselect cast(b.name as varchar)as colname from syscolumns where id = object_id'tb') and b.name = name and name <> 'id') ) aa select * from ta EXEC@s+' from ta a left join tb b on a.id = b.id') select * from ta drop table ta,tb /* id col1 col2 ----------- ----------- ----------- 1 1 1 2 3 1 (所影响的行数为 2 行) (所影响的行数为 2 行) id col1 col2 ----------- ----------- ----------- 1 3 1 2 1 1 (所影响的行数为 2 行) */
发表于:2007-12-06 19:50:517楼 得分:0
sql code
update ta a set a.字段1 =select b.字段1 from tb b where a.id = b.id ) set a.字段2=select b.字段2 from tb b where a.id = b.id ) .....
发表于:2007-12-06 19:52:278楼 得分:0
sql code
declare @s varchar8000) select @s = 'update a set ' select @s = @s + 'a.['+colname+']= b.['+colname+']' fromselect cast(b.name as varchar)as colname from sysobjects a,syscolumns b where a.id = object_id'ta') and a.id = b.id and existsselect cast(b.name as varchar)as colname from syscolumns where id = object_id'tb') and b.name = name and name <> 'id' ) ) aa select * from ta EXEC@s+' from ta a left join tb b on a.id = b.id') select * from ta drop table ta,tb
发表于:2007-12-06 19:53:099楼 得分:9
sql code
--try declare @fields nvarcharmax) select @fields=isnull@fields+'=tb.'+name+',','')+name from syscolumns where id=object_id'tb') and name<>id EXEC' update ta set '+@fields+' from ta join tb on ta.id=tb.id')
发表于:2007-12-06 19:53:1810楼 得分:0
如果这两个表里的字段都是未知的,只知道表tb中的字段在表ta中一定存在,而且对应的id数据是一样的,

这样需要依此判断吧,根据tb的字段来判断、更新
发表于:2007-12-06 19:55:0811楼 得分:0
我的那个动态的,自动去找相同的 列的
发表于:2007-12-06 19:58:1512楼 得分:0
sql code
--try declare @fields nvarcharmax) select @fields=isnull@fields+',','')+name+'=tb.'+name from syscolumns where id=object_id'tb') and name<>id EXEC' update ta set '+@fields+' from ta join tb on ta.id=tb.id')
发表于:2007-12-06 20:00:4713楼 得分:0
真是高手与云,感谢!!!
发表于:2007-12-06 20:02:2214楼 得分:0
sql code
create table ta(id int,col1 int, col2 int) create table tb(id int,col1 int,col2 int) insert ta select 1,1,1 insert ta select 2,3,1 insert tb select 1,3,3 insert tb select 2,1,5 go declare @s varchar8000) select @s = 'update a set ' select @s = @s + 'a.['+colname+']= b.['+colname+'],' fromselect cast(b.name as varchar)as colname from sysobjects a,syscolumns b where a.id = object_id'ta') and a.id = b.id and existsselect cast(b.name as varchar)as colname from syscolumns where id = object_id'tb') and b.name = name and name <> 'id') ) aa select * from ta set @s = left@s,len@s) - 1) EXEC@s+' from ta a left join tb b on a.id = b.id') select * from ta drop table ta,tb /* id col1 col2 ----------- ----------- ----------- 1 1 1 2 3 1 (所影响的行数为 2 行) (所影响的行数为 2 行) id col1 col2 ----------- ----------- ----------- 1 3 3 2 1 5 (所影响的行数为 2 行) */
发表于:2007-12-06 20:04:1515楼 得分:1
熊的更精减,学习了
发表于:2007-12-06 20:10:0216楼 得分:0
declare   @fields   nvarchar(max)
select   @fields=isnull(@fields+',','')+name+'=tb.'+name   from   syscolumns
where   id=object_id('tb')   and   name <> id
EXEC('   update   ta   set   '+@fields+'   from   ta   join   tb   on   ta.id=tb.id')


出现这个错误
将   nvarchar   值   'id'   转换为数据类型为   int   的列时发生语法错误。

怎么处理?
发表于:2007-12-06 21:05:5617楼 得分:0
sql code
declare @fields varchar100) select @fields=isnull@fields+',','')+ltrim(name)+'=tb.'+ltrim(name) from syscolumns where id=object_id'tb') and name <> 'id' EXEC' update ta set '+@fields+' from ta join tb on ta.id=tb.id')
发表于:2007-12-07 08:16:1418楼 得分:0
declare       @fields       varchar(100)  
select       @fields=isnull(@fields+',','')+ltrim(name)+'=tb.'+ltrim(name)       from       syscolumns  
where       id=object_id('tb')       and       name   <>   'id'  
EXEC('       update       ta       set       '+@fields+'       from       ta       join       tb       on       ta.id=tb.id')  



在关键字   'from'   附近有语法错误。
发表于:2007-12-07 08:43:1819楼 得分:0
一般的用过。动态的第一次见。
不过似乎还是有问题的
发表于:2007-12-07 11:09:0420楼 得分:0
happyflystone       已经解决这个问题!      
再次感谢  
create       table       ta       (id       int,col       int)  
create       table       tb(id       int,col       int)  
go  

insert       ta       select       1,2  
insert       tb       select       1,3  

declare       @fields       varchar(100)      
select       @fields=isnull(@fields+',','')+ltrim(name)+'=tb.'+ltrim(name)       from       syscolumns      
where       id=object_id('tb')       and       name       <>       'id'      
EXEC('       update       ta       set       '+@fields+'       from       ta       join       tb       on       ta.id=tb.id')  

    select       *       from       ta  
drop       table       ta,tb  
/*  

(所影响的行数为       1       行)  

id                                           col                                      
-----------       -----------      
1                                               3  

(所影响的行数为       1       行)  
发表于:2007-12-07 13:03:3521楼 得分:0
无枪狙击手的完整执行
declare   @s   varchar(8000)
select   @s   =   'update   a   set   '
select   @s   =   @s   +   'a.['+colname+']=   b.['+colname+']'
from   (
        select   cast(b.name   as   varchar)as   colname  
        from   sysobjects   a,syscolumns   b  
        where   a.id   =   object_id('ta')   and   a.id   =   b.id
        and   exists(
                select   cast(b.name   as   varchar)as   colname  
                from   syscolumns     where   id   =   object_id('tb')   and   b.name   =   name   and   name   <>   'id'
        )
)   aa
select   *   from   ta
EXEC   (   @s+'   from   ta   a   left   join   tb   b   on   a.id   =   b.id')
select   *   from   ta
drop   table   ta,tb


熊的不能完整执行   只能部分更新,还有一些字段没有更新,不知道是什么原因
declare               @fields               varchar(100)              
select               @fields=isnull(@fields+',','')+ltrim(name)+'=tb.'+ltrim(name)               from               syscolumns              
where               id=object_id('tb')               and               name               <>               'id'              
EXEC('               update               ta               set               '+@fields+'               from               ta               join               tb               on               ta.id=tb.id')    


快速检索

最新资讯
热门点击