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 

這是我將數據從一臺服務器傳輸到另一臺服務器的過程,因爲大約有數百萬個數據光標無效。在SQL Server中有沒有其他的遊標的替代方法?

請任何人都可以建議替代方法來代替遊標。

在此先感謝

+0

您是在嘗試傳輸整個表格還是僅傳輸數據的子集? – Greg

+0

Im將100000個數據從一個表格轉移到另一個表格。在光標中運行需要很長時間。 –

+0

如果你想傳輸整個表,然後使用bcp輸入/輸出。如果您想傳輸一部分數據,那麼PK /集羣密鑰是什麼密鑰? – Greg

回答

0

你可以像這樣使用Insertdelete分批:

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

這將導致問題,如果插入新行在INSERT完成和DELETE語句啓動之間,您可能會刪除新行,但它們未被插入。 – Greg

+0

如何更新?我必須刪除基於C_Flag –

0

隨着OUTPUT條款你能做到在一個查詢。如果需要,您也可以按C_Flag進行過濾。

; 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) 
相關問題