游标或While循环将是一个很好的选择,可以处理6,00,000多行数据

时间:2017-08-25 19:03:04

标签: sql sql-server sql-server-2012-web

我有一个table_A,我从.csv文件导入数据。我想将table_A中的一些列与table_B进行比较,并相应地将数据插入表中并将状态更新为table_A。 我应该使用什么while循环或光标.. Plz做建议

DECLARE @A_2 VARCHAR(10), @A_3 VARCHAR(50), @A_4 VARCHAR(100)
    DECLARE db_cursor CURSOR FOR  
    SELECT A_2, A_3, A_4 FROM Temp_table

OPEN db_cursor  
    FETCH NEXT FROM db_cursor   
    INTO @A_2, @A_3, @A_4 
    WHILE @@FETCH_STATUS = 0  
    BEGIN  
    If @A_2 <> (SELECT C_2 FROM Table_C where C_2= @A_2)
        UPDATE Temp_table SET [Status]='Not Exits in Table_C'
    ELSE BEGIN
       IF @A_3=(Select B_3 from Table_B where B_3=@A_3) AND @A_2=(SELECT B_2              FROM Table_B where B_2= @A_2)
       UPDATE Temp_table SET [Status]='Duplicate Row, Already Exists'
       ELSE 
            IF (@A_4 <>'B_4 '+'B_5')
            UPDATE Temp_table SET [Status]=' Format is not accepted '
            ELSE
            INSERT INTO Table_B(B_2, B_3, B_4) VALUES(@A_2, @A_3, @A_4)

    END
  CLOSE db_cursor  DEALLOCATE db_cursor    
  FETCH NEXT FROM db_cursor  INTO @A_2, @A_3, @A_4
    END   

此处Temp_table是我将从.csv文件导入数据的表,并且将使用Table_B,Table_C和Temp_Table的列进行比较 这是正确的做法吗?

3 个答案:

答案 0 :(得分:0)

我对性能不太熟悉,但我不推荐使用while循环,因为它会非常慢。我会做类似的事情:

subprocess.Popen('hh.exe "C:\WINDOWS\ULIX TxT Editor\Resources\helpCenter\helpCentre11.chm"')

这只是一般指南,我希望它可以帮助您入门。否则你必须更加具体。

更新和比较的参考资料:

How do I UPDATE from a SELECT in SQL Server?

Microsoft UPDATE

答案 1 :(得分:0)

都不是。如果您正在使用SQL,那么第一步是从程序上思考并转向基于集合的思考。

要执行您要执行的操作,请使用MERGEhttps://docs.microsoft.com/en-us/sql/t-sql/statements/merge-transact-sql

<强> SETUP

IF OBJECT_ID('tempdb..#table_A') IS NOT NULL
  DROP TABLE #table_A

CREATE TABLE #table_A (col1 int, col2 int, colX int, checkme bit DEFAULT 0) ;
INSERT INTO #table_A (col1, col2, colX)
VALUES 
      (1,1,1)
    , (2,2,2)
    , (3,3,3)
    , (4,4,4)
;

IF OBJECT_ID('tempdb..#table_B') IS NOT NULL
  DROP TABLE #table_B

CREATE TABLE #table_B (col1 int, col2 int, colX int) ;
INSERT INTO #table_B (col1, col2, colX)
VALUES 
      (0,0,1)
    , (0,0,2)
;

<强> BEFORE

SELECT * FROM #table_A ;     
SELECT * FROM #table_B ; 

QUERY TIME

MERGE #table_B AS target  
USING ( SELECT col1, col2, colX FROM #table_A ) AS source (col1, col2, colX)  
ON (target.colX = source.colX)  
WHEN MATCHED THEN   
    UPDATE SET col1 = source.col1
        , col2 = source.col2 
WHEN NOT MATCHED THEN  
    INSERT (col1, col2)  
    VALUES (source.col1, source.col2) 
;

<强> AFTER

SELECT * FROM #table_A ;     
SELECT * FROM #table_B ;

你也可以使用MERGE更新#table_A中的标志,但我不知道正确的语法。如果需要,您还可以在UPDATE后运行另一个MERGE

MARK TABLE_A FLAG

UPDATE #table_A
SET flag = 1
FROM #table_B
WHERE #table_A.col1 = #table_B.col1
    AND #table_A.col2 = #table_B.col1
    AND #table_B.colX IS NOT NULL
;

之后     SELECT * FROM #table_A;

MORE MERGE GOODIES: http://www.made2mentor.com/2012/07/got-the-urge-to-merge/

答案 2 :(得分:-1)

如果您想提高性能,那么您需要查看基于SET的操作。虽然循环和游标基本相同。

有关详细信息,请参阅以下链接

http://www.techrepublic.com/blog/the-enterprise-cloud/comparing-cursor-vs-while-loop-performance-in-sql-server-2008/