我想要一个更新临时表并通过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.
非常感谢。
答案 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);