0

我只是在阅读有关 SQL Server 游标的信息,我应该尽可能避免使用它们 :)

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

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

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

让我们有一个更新过程 X 接受一个帐户 ID 和一个交易 ID - 这是我要更新的行的唯一键

但是一个账户有更多的交易

SELECT accID, transID from table

现在我使用游标在表格上循环,总是使用accIDandtransID来获取行并更新它

我可以用非光标方式吗?

谢谢

4

2 回答 2

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 不是很熟悉,这应该是答案。

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

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

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

于 2013-05-24T11:13:54.940 回答
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
于 2013-05-23T10:31:05.683 回答