多列上来自csv的动态更新表

时间:2014-09-18 19:13:26

标签: sql sql-server

我想要一个更新临时表并通过PrimID和myDates对其进行排序的基本更新过程,然后更新永久表。数据结构如下所示:

PrimID  MyDates     Price
1       1/1/2014    1
1       1/2/2014    2
2       1/1/2014    11
2       1/2/2014    12
3       1/1/2014    21
3       1/2/2014    22

csv文件看起来完全一样,只是没有标题列名。这是我到目前为止的代码:

CREATE Table #TempT
(
   PrimID Int,
   myDate Date,
   myPrice Float
);

BULK
INSERT #TempT
FROM 'D:\MyWerk\SQL\TEST_dPrice_Data.csv'
WITH
(
FIELDTERMINATOR = ',',
ROWTERMINATOR = '\n'
)


Select * From #TempT
Order by PrimID,myDate

Drop Table #TempT

csv文件只是一个带有新的最新日期数据的“更新”文件,但可以保存已在永久表中捕获的日期数据。缺少什么,我想要的是永久表的更新与订购的#TempT,由PrimID排序,然后按顺序排列myDates(最旧的日期到最新),但是如果有PrimID& csv中的myDates数据已经存在于永久表中,我希望csv最新数据也覆盖永久文件中的价格数据。此外,有没有更好的方法来按时间顺序获取数据,除了使用order by?

我使用SQL Server 2012.

非常感谢。

1 个答案:

答案 0 :(得分:2)

不要尝试以某种行顺序将数据存储在SQL表中 - 这是低效的。您可以在查询数据时进行排序。

对于插入/更新行为,SQL合并可以很好地完成此操作。批量插入后,您可以执行以下操作:

MERGE PermanentT AS [TARGET]
USING #TempT AS [SOURCE]
ON [TARGET].PrimId = [SOURCE].PrimId
    AND [TARGET].MyDates = [SOURCE].MyDates
WHEN MATCHED AND [TARGET].PRICE <> [SOURCE].PRICE
THEN UPDATE SET [TARGET].PRICE = [SOURCE].PRICE
WHEN NOT MATCHED
THEN INSERT (PrimID, myDate, myPrice) 
VALUES (SOURCE.PrimID, SOURCE.myDate, SOURCE.myPrice);