SQL Server避免使用游标

SQL Server避免使用游标,sql,sql-server,cursor,Sql,Sql Server,Cursor,我只是在读有关SQL Server游标的文章,我应该尽量避免使用它们:) 是否总是有一种不用游标编写查询/函数/过程的方法 我在网上找到了一些例子,但它们通常都很简单 我的示例-我可以避免使用游标吗 让我们有一个更新过程X,其中包含一个帐户id和一个事务id——这是我要更新的行的唯一键 但一个账户有更多的交易 SELECT accID, transID from table 现在我使用光标在表上循环,总是使用accID和transID来获取行并更新它 我可以用非光标的方式吗 谢谢请参见关于如何

我只是在读有关SQL Server游标的文章,我应该尽量避免使用它们:)

是否总是有一种不用游标编写查询/函数/过程的方法

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

我的示例-我可以避免使用游标吗

让我们有一个更新过程X,其中包含一个帐户id和一个事务id——这是我要更新的行的唯一键

但一个账户有更多的交易

SELECT accID, transID from table
现在我使用光标在表上循环,总是使用
accID
transID
来获取行并更新它

我可以用非光标的方式吗

谢谢

请参见关于如何基于其他表中的数据更新一个表的示例:

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

有人问我想做什么的更多信息,它有点太长了,所以我将在这里添加它作为一个新的评论。。我无法在这里复制代码,因此我尝试至少捕获基本代码

我的代码看起来像:

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
谢谢你在回复和评论中的帮助,我对更新连接不是很熟悉,这应该是答案

在阅读了这些文章之后,我以如下形式提出了两个更新:

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...

它似乎起作用了。如果有更有效的方法,欢迎发表任何其他评论。

您如何更新-逻辑是什么?这完全取决于逻辑,但对于大多数操作,是的,您可以?我有一个accountID,但在“表”中有“子帐号”=我有ACC111,但有ACC111-001;ACC111-002。这意味着我为一个accountID获取所有transactionID:subAccountNum对,然后使用游标在这些对上循环,并更新表集x=y,其中subAccId=@subAccId和transID=@transID(这有帮助吗?)检查此链接,有很多很好的示例:当然,在某些情况下,游标是可以使用的。在表中循环更新特定行绝对不是其中之一。如果您在使用基于集合的操作替换光标时遇到问题,请发布整个查询,我相信您可以在此处获得帮助。@Nenad感谢您提供的链接,它很有帮助。我已经发布了大部分查询(至少是基本查询,因为我不能完整地复制它)作为一个新的答案。