dhl:不用游标批量更新的SQL语句

在更新一批记录时使用如下语句:

None.gif
None.gif
update  publish   set  contentid =
None.gif(
select   top   1  articles.contentid  from  articles
None.gif
where  articles.articleID = publish.objectID
None.gif)
None.gif
-- where publish.objectid=@objectID


前提是:publish表的记录不能大于Article的记录,即要插入的目标表中示能插入null,否则会提示错误。

全来没办法,改为游标:

None.gif
None.gif
None.gif
SET  NOCOUNT  ON
None.gif
DECLARE   @contentID   int
None.gif
declare   @objectID   int
None.gif
declare   @countnumber   int
None.gif
set   @countnumber = 0
None.gif
DECLARE  publish_cursor  CURSOR   FOR  
None.gif    
select  a.contentid,a.articleID  from  publish p 
None.gif    
inner   join  articles a   on  a.articleID = p.objectID
None.gif    
where  objectid > 0   and  p.contentid <>  a.contentid
None.gif    
and  (p.cellid = 160   or  cellid = 138 )
None.gif    
OPEN  publish_cursor
None.gif
None.gif    
FETCH   NEXT   FROM  publish_cursor
None.gif    
INTO   @contentID , @objectID
None.gif
None.gif        
WHILE   @@FETCH_STATUS   =   0
None.gif        
BEGIN
None.gif        
print   @contentID
None.gif        
print   @objectID
None.gif        
None.gif            
-- 修改记录
None.gif
             update  publish  set  ContentID = @contentID   where  objectid = @objectID
None.gif            
-- 修改结束
None.gif
             FETCH   NEXT   FROM  publish_cursor  into   @contentID , @objectID
None.gif            
None.gif        
END
None.gif    
CLOSE  publish_cursor
None.gif    
DEALLOCATE  publish_cursor
None.gif    
None.gif
GO
None.gif
None.gif
select  p.publishid,p.contentid,a.contentid,p.objectID,a.articleID  from  publish p 
None.gif
inner   join  articles a   on  a.articleID = p.objectID
None.gif
where  objectid > 0   and  p.contentid <>  a.contentid
None.gif
and  (p.cellid = 160   or  cellid = 138 )
None.gif
go
None.gif
None.gif
--  update publish set contentid=0 where (cellid=160 or  cellid=138)
None.gif--
 select * from publish p  where ( p.cellid=160 or  cellid=138)
None.gif


在没有更好的办法呢?
其实还可以这样:

None.gif update  publish   set  contentid =  a.contentid 
None.gif
from  articles a   inner   join  publish p  on  p.objectID = a.articleID
None.gif
where  cellid = 138
None.gif
None.gif
--  select * from publish where cellid=138
None.gif--
 update publish set contentid=0 where cellid=138

 

助人等于自助:

tab1  
  -tab2_id  
  -date1  
   
  tab2  
  -tab2_id  
  -data2  
   
   
  现想批量把在tab2中,符合tab2_id=tab1_id的data2更新到tab1当中:

 

update   a   set   data1=b.data2   form   tab1   a,tab2   b   where   a.tab1_id=b.tab2_id

 

SELECT getdate()
--游标变量
declare @pingcoid  varchar(50)
declare @username varchar(50)

declare cur cursor fast_forward for
SELECT pingcoid  FROM [PingCoApp].[AppleGrange].userinfo
open cur
fetch cur into  @pingcoid
while @@fetch_status =0
begin
--循环
SELECT @username=username  FROM pingco.dbo.TUserInfo  where pingcoid = @pingcoid
update [PingCoApp].[AppleGrange].userinfo set username=@username where  pingcoid = @pingcoid
fetch next from cur into @pingcoid
end
close cur
deallocate cur

SELECT getdate()


-------------
SELECT getdate()
update   [PingCoApp].[AppleGrange].userinfo
set  Username = isnull(b.truename,b.username)
--select a.Username , b.truename ,isnull(b.truename,b.username),b.username
from  [PingCoApp].[AppleGrange].userinfo a inner join
      pingco.dbo.TUserinfo b on a.pingcoid = b.pingcoid
SELECT getdate()

转载于:https://www.cnblogs.com/dudu837/archive/2009/04/21/1440480.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值