我有一个从.csv文件导入数据的table_A。我想将table_A中的一些列与table_B进行比较,并相应地将数据插入到表中,并将状态更新为table_A。请务必提个建议
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的列来完成,这样做正确吗?
发布于 2017-08-26 03:09:52
我对性能不是很熟悉,但我不建议使用while循环,因为它会非常慢。我会做一些类似这样的事情:
UPDATE table1
SET table1.column1 = table2.column1,
table1.column2 = table2.column2
WHERE (do a select statement or column comparison)这只是一个一般性的指南,我希望它能帮助你入门。否则,你将不得不更加具体。
更新和比较的参考资料:
发布于 2017-08-26 03:29:04
都不是。
要执行您希望执行的操作,请使用MERGE。https://docs.microsoft.com/en-us/sql/t-sql/statements/merge-transact-sql
设置
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。
标记TABLE_A标志
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
;后选择** FROM #table_A;
更多MERGE好东西:http://www.made2mentor.com/2012/07/got-the-urge-to-merge/
发布于 2017-08-26 03:14:31
如果你想提高性能,那么你需要考虑基于集合的操作。While循环和游标基本上是一回事。
有关更多详细信息,请参阅以下链接
http://www.techrepublic.com/blog/the-enterprise-cloud/comparing-cursor-vs-while-loop-performance-in-sql-server-2008/https://stackoverflow.com/questions/45887954
复制相似问题