我正在处理存储过程以找到格式不正确的Addr2行,并自动更正它们,或将它们移动到异常表中。在某种程度上,我已经取得了成功 - 杂志“跳过”记录的方式,并且必须在处理所有行之前运行两到三次。这显然不是我想要的。削下来后,我来到了核心问题:在执行sql语句时发生“跳过”,而使用rowcount的语句
----前面的代码来建立临时表#Addr2Chck,这将插入可疑的订单记录,并分配行号------
set @NumberRecords = @@ROWCOUNT
set @rowcount=1
WHILE @rowcount<= @NumberRecords
BEGIN
SELECT @Cusid= Cusid,
@OrderNum= Ordernum,
@StndAddr2= Addr2,
from @Addr2Chck
where [email protected]
update corp_orders
set [email protected]
from (SELECT rowed, t.OrderNum from #Addr2Chck c left join corp_orders t
on c.ordernum=t.ordernum) as j
where [email protected] and [email protected] and [email protected]
SET @ROWCOUNT= @ROWCOUNT + 1
END
很明显,在这个循环中会有if-else语句,但如果我没有简单的版本来工作,我会遍布整个地方。我敢肯定,我错过了一些显而易见的东西,并且导致了心智失明。
下面是一些我用供参考来源: http://www.java2s.com/Code/SQLServer/Transact-SQL/UsingROWCOUNT.htm Using row count from a temporary table in a while loop SQL Server 2008
以及微软SQL AdventureWorks的教科书。
我需要通过记录而不是批处理来记录这个记录,我相信这也是问题的一大部分。
谢谢你的时间!
埃塔:此链接在项目为理由的开始是给我为什么光标应该避免:http://www.sqlbook.com/SQL/Avoiding-using-SQL-Cursors-20.aspx
为什么不使用连接而不是while循环。 sql不是循环。 – Hogan
@Hogan是正确的,如果你可以帮助它,你不应该在SQL中使用任何循环。但是如果你真的必须使用CURSOR,你应该真正使用它。 –
您的proc在运行时数据是否被其他人更改?您可以尝试打印@ROWCOUNT以查看是否跳过任何行。我希望它不会漏掉它的数量,但现在的数据是如何变化的。 –