0
ALTER PROCEDURE [dbo].[sp_Curing_log_data] 
AS 
BEGIN 

SET NOCOUNT ON; 
BEGIN TRY 

DECLARE @Rdatetime AS Datetime 
DECLARE @Barcode AS Varchar(15) 
DECLARE @Cavity AS Varchar(5) 
DECLARE @IPLH AS Float 
DECLARE @IPRH AS Float 
DECLARE @ITLH AS Float 
DECLARE @ITRH AS Float 
DECLARE @PTLH AS Float 
DECLARE @PTRH AS Float 
DECLARE @SPLH AS Float 
DECLARE @SPRH AS Float 
DECLARE @MachineID AS Varchar(15) 
DECLARE @ShiftID AS Varchar(5) 
DECLARE @C_Flag AS Int 


DECLARE @MyCursor CURSOR 

SET @MyCursor = CURSOR FAST_FORWARD 

FOR 

select TOP (10000) * from [10.65.84.4].[CEAT].dbo.Curing_Trend with(NOLOCK) order by Rdatetime asc 

OPEN @Mycursor 

FETCH NEXT FROM @MyCursor 
INTO 
@Rdatetime,@Barcode,@Cavity,@IPLH,@IPRH,@ITLH,@ITRH,@PTLH,@PTRH,@SPLH,@SPRH,@MachineID,@ShiftID,@C_Flag 
     WHILE @@FETCH_STATUS = 0 
     BEGIN 

      INSERT INTO dbo.Curing_Trend (Rdatetime, Barcode, Cavity, IPLH, IPRH, ITLH, ITRH, PTLH, PTRH, SPLH, SPRH, MachineID, ShiftID) 
      values(@Rdatetime,@Barcode,@Cavity,@IPLH,@IPRH,@ITLH,@ITRH,@PTLH,@PTRH,@SPLH,@SPRH,@MachineID,@ShiftID) 

      Update [10.65.84.4].[CEAT].dbo.Curing_Trend SET C_Flag = 0 where Rdatetime = @Rdatetime and Barcode = @Barcode 

      FETCH NEXT FROM @MyCursor 
      INTO @Rdatetime,@Barcode,@Cavity,@IPLH,@IPRH,@ITLH,@ITRH,@PTLH,@PTRH,@SPLH,@SPRH,@MachineID,@ShiftID,@C_Flag 
     END 
     CLOSE @MyCursor 
     DEALLOCATE @MyCursor 
     Delete from [10.65.84.4].[CEAT].dbo.Curing_Trend where C_Flag =0 
    END TRY 
    BEGIN CATCH 
      EXEC [dbo].[sp_InsertErrorDetails] 
      Return 2 
     END CATCH 
    END 

Dies ist mein Verfahren für die Übertragung von Daten von einem Server auf einen anderen Server, da es über Millionen von Daten Cursor ist nicht wirksam.Gibt es alternative Methode für Cursor in SQL Server?

Bitte können Sie vorschlagen, alternative Möglichkeit anstelle von Cursor.

Vielen Dank im Voraus

+0

Sie versuchen, die gesamte Tabelle oder nur eine Teilmenge von Daten zu übertragen? – Greg

+0

Im Übertragen von 100000 Daten von einer Tabelle zu einer anderen. Es dauert sehr lange, wenn der Cursor läuft. –

+0

Wenn Sie die gesamte Tabelle übertragen möchten, verwenden Sie bcp in/out. Wenn Sie eine Teilmenge von Daten übertragen möchten, welche Schlüssel sind der PK/Clustering-Schlüssel? – Greg

Antwort

0

Sie Insert und delete von Batch wie diese verwenden:

INSERT INTO dbo.Curing_Trend (Rdatetime, Barcode, Cavity, 
IPLH, IPRH, ITLH, ITRH, PTLH, PTRH, SPLH, SPRH, MachineID, ShiftID)  
    SELECT TOP (10000) 
     t.Rdatetime, t.Barcode, t.Cavity, t.IPLH, 
     t.IPRH, t.ITLH, t.ITRH, t.PTLH, t.PTRH, 
     t.SPLH, t.SPRH, t.MachineID, t.ShiftID 
    FROM 
     [10.65.84.4].[CEAT].dbo.Curing_Trend ct 
    ORDER BY 
     Rdatetime ASC 

; WITH cte AS 
(
    SELECT TOP 10000 * 
    FROM [10.65.84.4].[CEAT].dbo.Curing_Trend ct 
    ORDER BY Rdatetime ASC 
) 
DELETE FROM cte 
+0

Dies würde Probleme verursachen, wenn neue Zeilen eingefügt wurden Zwischen dem Zeitpunkt, zu dem die INSERT-Anweisung und die DELETE-Anweisung gestartet wurden, konnten Sie möglicherweise die neue (n) Zeile (n) löschen, sie wurden jedoch nicht eingefügt. – Greg

+0

wie updaten ??? Ich muss basierend auf C_Flag löschen –

0

Mit OUTPUT Klausel Sie es in einer Abfrage tun. Sie können auch nach C_Flag filtern, wenn Sie möchten.

; WITH cte AS 
(
    SELECT TOP 10000 * 
    FROM [10.65.84.4].[CEAT].dbo.Curing_Trend ct 
    ORDER BY Rdatetime ASC 
) 
DELETE 
FROM cte 
OUTPUT Rdatetime, Barcode, Cavity, IPLH, IPRH, ITLH, ITRH, PTLH, PTRH, SPLH, SPRH, MachineID, ShiftID 
INTO [CEAT].dbo.Curing_Trend (Rdatetime, Barcode, Cavity, IPLH, IPRH, ITLH, ITRH, PTLH, PTRH, SPLH, SPRH, MachineID, ShiftID)