Ich schaue auf diese Abfrage und ich bin etwas verwirrt über einige Dinge.
-- 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
------------
- Wird eine temporäre Tabelle erstellt?
SELECT * INTO SOD
Wenn ja, ist dies wirklich notwendig? Kann ich einfach den while-Teil und darunter verwenden? - Wie funktioniert
IF @@ROWCOUNT = 0
jemals Null werden? Erhöht es sich selbst oder so etwas?
bearbeiten
Das habe ich jetzt, aber ich glaube immer noch, dass es eine Endlosschleife oder so etwas gibt
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
Ich habe nachgezählt
select count(*) from myTbl
where myDate < '2011-Jan-02'
Dies ergibt eine Anzahl von 1,448,982
der letzte Ausdruck, den ich erhielt, war 31,110,000
Bearbeiten 2
Ich habe dies hinzugefügt und jetzt hört es auf, aber es ist immer noch nicht 100%ig da, wo es sein sollte
while (Select Count(*) From myTbl Where myDate <'2011-Jan-02' ) >= @rowCount
Bearbeiten 3
Ich denke, dass Edit 2 einfach nur die gleichen 10.000 Zeilen immer und immer wieder macht.