我有一个现有的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是与数据库相关的列名,而OLD / NEW与数据相关。
因此对于每一行(约2500行)
每列中与OLD匹配的数据库值需要更改为NEW
我目前的想法是以类似的方式做到这一点: 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 :(得分:12)
您不需要遍历电子表格中的每一行。您可以使用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)
答案 1 :(得分:1)
看起来Jeff为您提供了所需的答案,但是对于希望从Google表格更新数据库的任何人,这是使用SeekWell desktop app的替代方法。有关此答案的屏幕截图版本,请参见this article。
写一个SQL语句,其中SELECT
是您希望能够在工作表中更新的所有列。您可以在WHERE
子句中正常添加过滤器。
在应用程序顶部选择“ Sheets”,然后打开一个Sheet。然后单击代码单元中的目标图标,然后选择“与数据库同步”
添加表和主键
在目标输入中,添加表名和该表的主键。
运行代码单元将添加一个具有选定数据和表名作为工作表名称的新工作表。请注意,您必须在单元格A1中启动表格。最好包含ORDER BY
。
添加操作列 在工作表中添加“ seekwell_action”列,其中包含您希望对每一行执行的操作。可能的操作是:
更新-更新行中的所有列(需要唯一的主键)
插入-将行添加到数据库中(您需要包括数据库所需的所有列)
同步-每次查询运行都会按照时间表执行更新操作(请参见下面的“ 5.设置时间表”)
完成-计划已运行(请参阅下文)并已采取措施后的状态。现在,新数据应该在您的数据库中。请注意,“同步”操作将永远不会显示为完整,因为它们在每次计划运行时都会运行。要停止“同步”操作,请手动进行更改。
陷阱
您需要在单元格A1中启动表格。
雪花列名称区分大小写。指定主键等时,请务必遵守这一点。
如果服务器位于防火墙后面,则需要将SeekWell的静态IP地址列入白名单以使用调度。有关将here列入白名单的更多信息。