能不能只更新改变的字段

robertzy 2004-12-03 04:20:40
在前台如果改变了某些字段得值(不是全部),在后台的存储过程怎么只更新那些改变的值,而不是全部。例如,表有10个字段,用户在前台只更新了其中几个,怎么样作检查并相应的更新。我不想象这样做:

Update table1 set col1=@col1, col2=@col2,......col10=@col10.

但我不只怎么做
...全文
361 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
acenk 2004-12-10
  • 打赏
  • 举报
回复
再加一个参数表示是否更新就可以啊
631799 2004-12-10
  • 打赏
  • 举报
回复
--每隔一段时间查一次表,时间间隔不定,每次要查到表里面对于上次查询时不同的数据,
--也就是说在上次查询完一直到这次查询开始前,中间发生的所有的update和insert的数据都要被查出来.不用建临时表!

/*方案1,触发器+标识字段(要求你的表中有主键)

在你的表中增加一个标识字段: 字段名:标识 类型:bit,默认值:1

写如下触发器:*/
create trigger tr_process on 你的表
for update
as
if update(标识) return
update a set 标识=1
from 你的表 a,inserted b
where a.主键=b.主键
go

--查询的时候,用:
select * from 你的表 where 标识=1
update 你的表 set 标识=0 --查询完成后,将标识设置为0,表示已经查询过




--方案2,用 BINARY_CHECKSUM + 标识字段 (不要求表中有主键,但要写字段列表)

--在你的表中增加一个字段: 字段名:标识 类型:int 默认值:0

--查询时用:
select * from 表
where 标识<>BINARY_CHECKSUM(列1,列2,...列n)

--然后更新标识字段
update 表 set 标识=BINARY_CHECKSUM(列1,列2,...列n)


--方案2的简单示例
declare @t table(a int,b int,标识 int)
insert @t(a) select 1
union all select 2

update @t set 标识=BINARY_CHECKSUM(a,b)

update @t set a=100 where a=2

select a,b from @t
where 标识<>BINARY_CHECKSUM(a,b)
vinsonshen 2004-12-06
  • 打赏
  • 举报
回复
UP
zhang_yzy 2004-12-03
  • 打赏
  • 举报
回复
实在不行,你就在本地先保存一份,当提交时,判断一下不就行了
另外,有些开发工具有这种功能的,
例如DELPHI中在ADO或QUREY 中都有属性可以判断是否被修改了
nksharp 2004-12-03
  • 打赏
  • 举报
回复
for(int i =0 ;i ++; i < 10){ //前台的纪录数目
--
string strupdate;
for(int j =0;j++;j < 10){ //改变的列数
if ( 改变的列){
string strcolumn,strvalues;
strcolumn = 'aa';
strvalues = '1';
strupdate = strupdate + strcolumn + '=' + strvalues;
}
exec(update table set '+strupdate+')

}
就可以把 别弄得太复杂 呵呵 我也就知道这模多了


}
robertzy 2004-12-03
  • 打赏
  • 举报
回复
多谢nksharp,我不大想用statement,因为在存储过程中可以加其它逻辑,如transaction。用statement更新,适应性不强。再看看有没有好办法。
robertzy 2004-12-03
  • 打赏
  • 举报
回复
不大明白,拆分完了再怎么样呢,放到临时表又怎么样呢?
nksharp 2004-12-03
  • 打赏
  • 举报
回复
是丫 你就直接 在前台循环比较更新就可以了 其实根本不用存储过程 反而麻烦 效率不搞
nksharp 2004-12-03
  • 打赏
  • 举报
回复
sql的存贮过程不能传递数组的 你可以用逗号组成一个大字符串 传导后台再拆分 因为你是多行改变的 或者临时表也可以 尝试一下就知道了 我的e-mail:pang_kunlong@hotmail.com 可以把代码发给我看看 如果有必要的话 呵呵
robertzy 2004-12-03
  • 打赏
  • 举报
回复
感觉是执行SQL语句,并不是个存储过程,好像也不太好
robertzy 2004-12-03
  • 打赏
  • 举报
回复
你是说用exec 去执行statement? 不然岂不是要做排列组合。
nksharp 2004-12-03
  • 打赏
  • 举报
回复
引擎怎模做的 问问ms的人把 呵呵 太深了 。。。。。。。。。你可以这样是一下:你穿参数时候 这样传
col2=@col2,col10=@col10.. 把你改变的列名称的字段传过去 后台直接 更新就可以了
jiang130 2004-12-03
  • 打赏
  • 举报
回复
感覺是個概念的問題,你存儲過程的代碼可以在觸發器里做嗎?
robertzy 2004-12-03
  • 打赏
  • 举报
回复
对啊,我就是想知道引擎做了什么事情/怎么做的,
robertzy 2004-12-03
  • 打赏
  • 举报
回复
上面写得有点不清楚,应该是Update table1 set col1=@col1, col2=@col2,......col10=@col10. where id = @id …..反正先就更新一行
nksharp 2004-12-03
  • 打赏
  • 举报
回复
这只能具体问题具体分析了 因为ACCESS中用ole把前台的表邦定了 利用ADO的引擎能够做出判断 但你说的如果直接是传参数的话 可能没有一个公共的方法调用去实现 。。。。反正我是不知道 呵呵 帮你顶顶。。
robertzy 2004-12-03
  • 打赏
  • 举报
回复
其实在前台比较所花费的时间和代码不会太多,而且如果发现没有一个改变,就不用传到SQL了,这样更合理,但关键是我检查出哪几个变了,后台的存储过程怎么写
robertzy 2004-12-03
  • 打赏
  • 举报
回复
是这样的,好比前台有一个表格,如个人的详细信息,有20个字段,每次用户打开后要更新,但我不知道到底会改几个,也可能一个不改。当用户按了更新按钮后,自然要把改的数据保存到数据库,最简单的办法就是写一个存储过程,把前台的数据全部传到SQL去更新,但这样有个问题,如果我的表有个trigger要跟踪某个字段的变化,通常用update(column)去检查,这样一来,即使那个字段没更新,也会让update(column)为真,当然可以用deleted/inserted去比较,但这样就多了一步,如果跟踪的字段多,会影响performance.所以我不知道有没有办法解决这个问题。而且只更新改变的也比较合理,就像在Access中改一样,你改一行的一个字段,其他不悔改的。
nksharp 2004-12-03
  • 打赏
  • 举报
回复
其实你并不知道怎样去检查哪几个字段改变了所以 才又这样的问题 但是你要去检查那几个字段改变了 所花费的时间和代码更多 效率不如直接都更新了快,,,效率与优化始终是一对矛盾。。。:)
liuchunjp 2004-12-03
  • 打赏
  • 举报
回复
更新了几个改几个就行啦。不知道搂主的意思是什么。
加载更多回复(1)

27,579

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 应用实例
社区管理员
  • 应用实例社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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