Я смотрю на этот запрос , и меня несколько смущают некоторые вещи.
-- T-SQL large update table
USE tempdb;
SELECT * INTO SOD
FROM AdventureWorks2008.Sales.SalesOrderDetail
GO
--(121317 row(s) affected)
-- SQL update in batches of 10,000
WHILE (2 > 1)
BEGIN
BEGIN TRANSACTION
UPDATE TOP ( 10000 ) SOD
SET UnitPriceDiscount = 0.08,
ModifiedDate = CONVERT(DATETIME,CONVERT(CHAR(10),getdate(),112))
WHERE ModifiedDate < CONVERT(DATETIME,CONVERT(CHAR(10),getdate(),112))
IF @@ROWCOUNT = 0
BEGIN
COMMIT TRANSACTION
BREAK
END
COMMIT TRANSACTION
-- 1 second delay
WAITFOR DELAY '00:00:01'
END -- WHILE
GO
/* Messages
(10000 row(s) affected)
(10000 row(s) affected)
(10000 row(s) affected)
(10000 row(s) affected)
(10000 row(s) affected)
(10000 row(s) affected)
(10000 row(s) affected)
(10000 row(s) affected)
(10000 row(s) affected)
(10000 row(s) affected)
(10000 row(s) affected)
(10000 row(s) affected)
(1317 row(s) affected)
(0 row(s) affected)
*/
-- Cleanup
DROP TABLE SOD
GO
------------
- Он создает временную таблицу?
SELECT * INTO SOD
если так, то действительно ли это нужно?Могу ли я просто использовать часть while и ниже? - Как
IF @@ROWCOUNT = 0
может стать нулем?Делает ли это какое-то самовозрастание или что-то в этом роде?
Редактировать
Это то, что у меня есть сейчас, но я все еще думаю, что существует бесконечный цикл или что-то в этом роде
BEGIN TRAN
declare
@rows_updated int ,
@rowCount int,
@batch_size int
set @rows_updated = -1
set @batch_size = 10000
set @rowCount = 0;
Declare @xx VARCHAR(20) DECLARE @length INT
SET @length = 17 SET @xx = 'XXXXXXXXXXXXXXXX'
while ( @rows_updated != 0 )
begin
update top(@batch_size) myTbl
SET myNumber = SUBSTRING(@xx, 0, @length - len(RIGHT(myNumber, 4))) + RIGHT(myNumber, 4)
WHERE myDate <'2011-Jan-02'
set @rows_updated = @@rowcount
set @rowCount += 10000
print @rowCount
end
ROLLBACK
Я сделал подсчет
select count(*) from myTbl
where myDate < '2011-Jan-02'
, это возвращает счет 1,448,982
последняя полученная мной распечатка была 31,110,000
Редактировать 2
Я добавил это, и теперь оно останавливается, но все равно не на 100%, где это должно быть в
while (Select Count(*) From myTbl Where myDate <'2011-Jan-02' ) >= @rowCount
Редактировать 3
Я думаю, что edit 2 просто делает одни и те же 10000 строк снова и снова.