2014-09-18 12 views
0

我想要一個更新臨時表的基本更新過程,並通過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

回答

2

不要試圖以某種行順序將數據存儲在SQL表中 - 這是效率低下的。您可以在查詢數據時進行排序。

至於插入/更新行爲,SQL合併做得很好。大容量插入後,你可以執行這樣的事情:

​​
+0

謝謝Greenspark,看起來正是我需要的。有一件事,我得到「TARGET附近的錯誤語法」。在你的行中,「什麼時候不匹配[TARGET]」? – Allstar 2014-09-22 18:59:05

+0

糟糕。是的,我們不需要那裏的「By [TARGET]」。另外,整個合併聲明需要以分號結尾。我已經做出了上述變化。 – Greenspark 2014-09-22 21:36:24