2017-08-25 20 views
1

我有一个table_A从哪里我从.csv文件导入数据。我想比较table_A中的一些列与table_B,并相应地将数据插入到表中并将状态更新为table_A。 我应该用什么While循环或光标.. PLZ确实表明游标或while循环什么将是一个很好的选择,以处理6,00,000+行数据

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 [email protected]_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文件,比较导入数据的表将使用表-B,Table_C的列完成与Temp_Table 它会是正确的方法吗?

+5

大思维转变与关系型数据库是摆脱程序思维了 - 一会儿,curosrs - 并进入思考套。 SQL在比较大量数据和处理数据方面非常出色。拥抱SQL! – n8wrl

+7

也不要使用基于集合的查询。 – RBarryYoung

+0

位开放式,其他选项可用,取决于您可以使用直接查询的性能(无需循环或游标,基于集合的方法会更好),或者如果数据使用SSIS作为更多线性思维的选项set太大/ perf是一个问题 – Andrew

回答

0

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

UPDATE table1 
SET table1.column1 = table2.column1, 
    table1.column2 = table2.column2 
WHERE (do a select statement or column comparison) 

这只是一个通用指南,我希望它能帮助您入门。否则,你将不得不变得更具体。

参考更新和比较:

How do I UPDATE from a SELECT in SQL Server?

Microsoft UPDATE

-1

如果你想提高性能,那么你需要看看基于SET操作。而循环和光标基本上是相同的东西。

参考更多详细信息

http://www.techrepublic.com/blog/the-enterprise-cloud/comparing-cursor-vs-while-loop-performance-in-sql-server-2008/ 
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) 
; 

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

查询时间

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) 
; 

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

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

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 
; 

AFTER AFTER SELECT * FROM #table_A;

更多MERGE超值服务:http://www.made2mentor.com/2012/07/got-the-urge-to-merge/

相关问题