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

问题描述:

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

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(最旧的日期到最新),但如果有csv中的myDates数据,已经在永久表中,我希望csv最新数据也覆盖永久文件中的价格数据。另外,有没有更好的方式按时间顺序获取数据,而不是使用order by?

我使用SQL Server 2012.

非常感谢。

+0

我很难理解你在做什么之后,你想根据'primid更新'mydate'和'myprice'值',但只有价格,如果'primid'和'mydate'在两个表中? – 2014-09-18 19:18:34

+0

更新查询中很少需要order by子句。根据你试图达到的目标,sql max()函数可能是合适的。 – 2014-09-18 19:37:07

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

至于插入/更新行为,SQL合并做得很好。大容量插入后,你可以执行这样的事情:

​​
+0

谢谢Greenspark,看起来正是我需要的。有一件事,我得到“TARGET附近的错误语法”。在你的行中,“什么时候不匹配[TARGET]”? – Allstar 2014-09-22 18:59:05

+0

糟糕。是的,我们不需要那里的“By [TARGET]”。另外,整个合并声明需要以分号结尾。我已经做出了上述变化。 – Greenspark 2014-09-22 21:36:24