我只是在阅读有关SQL Server游标的内容,我应尽量避免使用它们。)
是否总有一种方法可以编写没有游标的查询/函数/过程?
我在网上找到了一些例子,但它们通常很简单。
我的例子 - 我可以避免使用游标吗?:
让我们有一个更新程序X获取帐户ID和交易ID - 这是我想要更新的行的唯一键
但帐户有更多交易
SELECT accID, transID from table
现在我使用游标在表格上循环,始终使用accID
和transID
来获取行并更新它
我可以用非光标方式吗?
由于
答案 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