10

我有一个现有的 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=新3,d=新4?

4

2 回答 2

15

您不需要遍历电子表格中的每一行。您可以使用该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)
于 2013-02-11T14:43:23.497 回答
1

看起来 Jeff 为您提供了所需的答案,但对于任何希望从 Google 表格更新数据库的人来说,这里有一个替代方案,使用SeekWell 桌面应用程序。有关此答案的屏幕截图版本,请参阅本文

  1. 在电子表格中获取正确的行和列(看起来@sbozzie 已经有了这个)

编写一个 SQL 语句,它SELECT是您希望能够在工作表中更新的所有列。WHERE 您可以在子句中照常添加过滤器。

  1. 选择应用程序顶部的“表格”并打开表格。然后单击代码单元格中的目标图标并选择“与数据库同步”

  2. 添加表和主键 在目标输入中,添加表名和表的主键。运行代码单元格将添加一个新工作表,其中包含所选数据和您的表格名称作为工作表名称。请注意,您必须在单元格 A1 中开始您的表格。包含一个ORDER BY.

  3. 添加操作列 在工作表中添加一个“seekwell_action”列,其中包含您希望对每一行执行的操作。可能的行动是:

更新 - 更新行中的所有列(需要唯一的主键)

插入 - 将行添加到您的数据库(您需要包括数据库所需的所有列)

同步 - 每次查询运行时都会按计划执行更新操作(请参阅下面的“5. 设置计划”)

完成 - 计划运行(见下文)并采取措施后的状态。新数据现在应该在您的数据库中。请注意,“同步”操作永远不会显示完成,因为它们会在每次计划运行时运行。要停止“同步”操作,请手动更改它。

  1. 设置计划 要执行这些操作,请选择应用程序顶部的时钟图标,指明频率和准确时间,然后单击“保存”。您可以从插入的“RunSheet”(不要删除此表,否则您将需要重置您的日程安排)或seekwell.io/profile管理您的日程安排。如果您需要立即运行这些操作,您可以从 /profile 执行此操作。

陷阱

您需要在单元格 A1 中开始您的表格。

雪花列名称区分大小写。在指定主键等时请务必遵守这一点。

如果您的服务器位于防火墙后面,则需要将 SeekWell 的静态 IP 地址列入白名单才能使用调度。在此处查看有关白名单的更多信息。

于 2019-06-25T20:26:19.840 回答