SQL Server避免游标

时间:2013-05-23 10:28:37

标签: sql sql-server cursor

我只是在阅读有关SQL Server游标的内容,我应尽量避免使用它们。)

是否总有一种方法可以编写没有游标的查询/函数/过程?

我在网上找到了一些例子,但它们通常很简单。

我的例子 - 我可以避免使用游标吗?:

让我们有一个更新程序X获取帐户ID和交易ID - 这是我想要更新的行的唯一键

但帐户有更多交易

SELECT accID, transID from table

现在我使用游标在表格上循环,始终使用accIDtransID来获取行并更新它

我可以用非光标方式吗?

由于

2 个答案:

答案 0 :(得分:1)

我被问到有关我想做什么的更多信息,它有点太长了,所以我会在这里添加它作为一个新评论..我不能在这里复制代码,所以我试图捕获至少是基地。

我的代码看起来像:

DECLARE @headAcc varchar(20)
set @headAcc='ACC111'

declare @id varchar(20), @clId varchar(20)
declare cur CURSOR for
select addID, transID from Table1
where accID like @headAcc+'%' and...
order by 1 desc

OPEN cur
FETCH NEXT from cur into @accID, @transID

WHILE @@FETCH_STATUS = 0
BEGIN
 -- 1
 update Table2
  set colX = ...
 where accID=@accID and transID=@transID and...
 -- 2
 update Table3
  set colY = ...
 where accID=@accID and transID=@transID and...

 FETCH NEXT from cur into @accID, @transID
END

CLOSE cur
DEALLOCATE cur

感谢答案中的帮助和评论中的链接,我对UPDATE JOIN并不是很熟悉,这应该是答案。

阅读完文章后,我想出了两个更新形式,如:

DECLARE @headACC varchar(20)
set @headACC='ACC111'

update t2
set t2.colX = ... 
from Table2 t2
     join Table1 t1
on t1.accID=t2.accID
 and t1.transID=t2.transID
where t1.accID like @headAcc+'%' 
 and...

似乎有效。任何其他评论赞赏,例如。如果有更有效的方法。

答案 1 :(得分:0)

请参阅MSDN中有关如何根据其他表中的数据更新一个表的示例:

USE AdventureWorks2012;
GO
UPDATE Sales.SalesPerson
SET SalesYTD = SalesYTD + SubTotal
FROM Sales.SalesPerson AS sp
JOIN Sales.SalesOrderHeader AS so
    ON sp.BusinessEntityID = so.SalesPersonID
    AND so.OrderDate = (SELECT MAX(OrderDate)
                        FROM Sales.SalesOrderHeader
                        WHERE SalesPersonID = sp.BusinessEntityID);
GO