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) 
相关问题