3 Stimmen

Wie wird diese Abfrage beendet?

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

------------
  1. Wird eine temporäre Tabelle erstellt? SELECT * INTO SOD Wenn ja, ist dies wirklich notwendig? Kann ich einfach den while-Teil und darunter verwenden?
  2. 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.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X