日期:2014-05-18  浏览次数:20583 次

请教一个SQL update写法的问题。
比如mytable中有A   B   C   D   E   F....等等n个列
而具体业务中,有的需要更新AC,有的需要更DEF。
在写具体的UpdateTable函数的时候如何写?
是写一个函数的N个重载版本吗?那么如果有业务1需要更新AC,业务2需要更新BD,而ABCD都是int的话,怎样写?
或者是只写一个UpdateTable(A,B,C,D...)然后在函数中根据情况选择性的拼装?那样的话string等类型容易根据是否为空判断是不是要拼装到具体的Update语句,而数值类型的如何判断?
还是封装一个参数类,根据业务赋值以后传递给UpdateTable函数,在函数中从这个类取得字段名,数据,数据类,来构建SQL语句和SQL语句用的参数?

------解决方案--------------------
根据不同的业务,用 'a=1,b=2,c=3 '这样的参数传到存储过程 不行吗?
------解决方案--------------------
做通用的不好实现.
最好在前台组合好SQL语句,
如更新AC,
'update mytable
set A= '+值+ ',
C= '+值+
'where 条件 '
再发至数据库执行.
字段的类型可从syscolumns中获取.
------解决方案--------------------
--试下这个(还不完善,只能更新到某一固定值)
create table test(a int,b int,c int,d int)
go
insert test select 11,20,34,48
union all select 56,101,86,43
go

--@x:列序号的组合(当前举例是更新列值为100,可根据情况具体修改,如可增加一传入参数代替100)
create proc prUpdateCol
(@x varchar(100))
as
begin
declare @s varchar(4000)
select @s = ' '
select @s= @s +c.name+ '= case when charindex( ' ' '+convert(varchar,c.colorder)+ ' ' ', ' ' '+@x+ ' ' ') > 0 then 100 else '+c.name+ ' end, '
from syscolumns c,sysobjects o where o.id = c.id and o.name = 'test '

select @s = left(@s,len(@s) - 1)
--更新指定的列,未指定的列指定为原值
exec ( 'update test set '+@s)
end
--执行(只更新第1--3列)
exec prUpdateCol '123 '
------解决方案--------------------
http://community.csdn.net/Expert/topic/5471/5471834.xml?temp=.119198

看上面贴子中我的回复,差不多的~~~存储过程加一个参数~~~