2013-02-11 84 views
8

我有一個現有的MSSQL數據庫,其中某些列中的值需要根據包含舊數據和新數據映射的電子表格進行更新。從電子表格更新現有的數據庫值

電子表格是這樣的:

 | OLD DATA  | NEW DATA  | 
RECORD | A | B | C | D | A | B | C | D | 
1  |OLD|OLD|OLD|OLD|NEW|NEW|NEW|NEW| 
2  |OLD|OLD|OLD|OLD|NEW|NEW|NEW|NEW| 

凡ABCD是列名,這涉及到數據庫中,並且舊/新涉及的數據。

因此,對於每一行(約2500行)

在每列匹配OLD數據庫值,需要改變,以新的

我現在的想法是做類似的方式來這: SQL Statement that Updates an Oracle Database Table from an Excel Spreadsheet

本質上是讓Excel制定一個替換語句列表,雖然這感覺就像一個可怕的複雜的方式來處理這個問題!

有沒有辦法讓電子表格中的每一行都有SQL循環,檢查a = old,b = old2,c = old3,d = old4的所有記錄,然後用適當的a = new替換這些值, b = new2,c = new3,d = new4?

+0

你可以改變你的Excel文件的格式,給人獨特的列標題,以每列(即記錄,OldA,OLDB,紐瓦,福利局)? – sgeddes 2013-02-11 14:40:36

+0

是的 - excel文件可以自由調整 – sbozzie 2013-02-11 14:44:40

+0

傑夫的答案正是我以爲你可以改變你的列名。讓我們知道你是否有任何麻煩。祝你好運。 – sgeddes 2013-02-11 14:47:40

回答

11

您不應該循環查看電子表格中的每一行。您可以使用OPENROWSET命令(如鏈接到的答案中)將電子表格數據加載到某種臨時表中。然後,您可以針對該表運行常規的UPDATE聲明。

這將是這個樣子

UPDATE YourTable 
SET YourTable.A = ExcelTable.NewDataA, 
    YourTable.B = ExcelTable.NewDataB, 
    YourTable.C = ExcelTable.NewDataC, 
    YourTable.D = ExcelTable.NewDataD 
FROM YourTable 
INNER JOIN OPENROWSET('Microsoft.Jet.OLEDB.4.0', 
     'Excel 8.0;Database=C:\foldername\spreadsheetname.xls;', 
     'SELECT column1name, column2name, column3name, column4name 
      FROM [worksheetname$]') AS ExcelTable 
ON YourTable.ID = ExcelTable.ID 
WHERE (YourTable.A = ExcelTable.OldDataA 
    AND YourTable.B = ExcelTable.OldDataB 
    AND YourTable.C = ExcelTable.OldDataC 
    AND YourTable.D = ExcelTable.OldDataD) 
+0

嗚!這工作得很好,謝謝:)爲了讓列名滾動(在新數據中添加了額外的數據列),但現在我知道關於excel - > SQL! – sbozzie 2013-02-12 10:18:08

相關問題