2016-12-01 78 views
0

所以我在我的數據庫中有這個表。我們會說它叫做usersSQL Server 2012:從基於主鍵的CSV更新數據

UserID UserName UserDescription 
----------------------------------- 
1  test1  Test User #1 
2  test2  Test User #2 
3  test3  Test User #3 
4  test4  Test User #4 
5  test5  Test User #5 

而且我有這個CSV文件:

1,"Harry Potter" 
4,"Hermione Granger" 
3,"Ron Weasley" 

我想是從CSV文件更新表。下面是我在尋找的結果:

UserID UserName UserDescription 
----------------------------------- 
1  test1  Harry Potter 
2  test2  Test User #2 
3  test3  Ron Weasley 
4  test4  Hermione Granger 
5  test5  Test User #5 

而不必編寫一個程序來做到這一點,是有辦法來完成這種更新的CSV文件中?

基本上我想要做這樣的事情,你可以在導入數據嚮導做什麼 - 的CSV列映射到它們各自的數據庫列 - 但有數據庫更新任何列,其中在數據庫中的主鍵匹配在CSV文件中分配列。

(SQL Server 2012中)

+1

難道您不能將它加載到臨時表中,然後加入並更新? –

+0

@inquisitive_mind爲什麼不把它作爲答案? –

+0

我是'OPENROWSET'的粉絲(參見@ ron-smith's awer)。我更喜歡將數據導入臨時表。如果有人感興趣:[OPENROWSET和BULK行集供應商入門](http://itsalljustelectrons.blogspot.com/2016/01/Openrowset-Bulk-Rowset-Provider-Part-2.html) – DMason

回答

0

我建議以下步驟:

  1. 導入CSV到一個臨時表。

    相關問題詳情:Import CSV file into SQL Server

  2. 使用臨時表中的數據更新主表。有關詳細信息,

    相關問題:How do I UPDATE from a SELECT in SQL Server?

    代碼示例:

    UPDATE users 
        SET users.UserDescription = #import.UserDescription 
        FROM users 
         INNER JOIN #import ON users.UserID = #import.UserID 
    
+0

沒想到事實證明,這是最簡單的方法。謝謝! – fdmillion

1

您可以使用openrowset訪問您的CSV文件中的SQL Server。此示例假定您的表和csv文件中具有匹配的列名稱。您可以根據需要調整文件名,目錄和列名稱:

update users 
    set users.UserDescription = csv.UserDescription 
    from users 
     inner join openrowset('MSDASQL', 
      'Driver={Microsoft Access Text Driver (*.txt, *.csv)}', 
      'select * from C:\YourCSV.csv') as csv 
      on csv.UserID = users.UserID 
+0

這不需要該文件駐留在SQL服務器上嗎?假設我沒有寫訪問權限,可以在運行SQL Server的服務器上放置任意的CSV文件。 – fdmillion