【发布时间】:2017-08-25 19:03:03
【问题描述】:
我有一个 table_A,我从 .csv 文件导入数据。我想将 table_A 中的一些列与 table_B 进行比较,并相应地将数据插入到表中并将状态更新为 table_A。 我应该使用While循环或光标..请建议
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 的列进行比较 这会是正确的做法吗?
【问题讨论】:
-
关系数据库的重大转变是摆脱程序性思维 - while 和 curosrs - 并开始考虑集合。 SQL 擅长比较大量数据并对其进行操作。拥抱 SQL!
-
都不行,改用基于集合的查询。
-
位开放式,还有其他选项可用,取决于性能,您可以使用直接查询(不需要循环或游标,基于集合的方法会更好),或使用 SSIS 作为选项如果数据集太大/性能是一个问题,则可以进行更线性的思考
-
如果您希望共享一些示例数据,您打算如何比较它们,以及您打算将什么结果插入到新表中,我们可以帮助编写该 SQL。很可能所有这三个步骤都是 1 个 SQL 语句。
标签: sql sql-server sql-server-2012-web