【问题标题】:SQL Server - Clear and Populate ExcelSQL Server - 清除和填充 Excel
【发布时间】:2016-07-06 17:45:47
【问题描述】:

我需要将数据从 SQL Server 2014 推送到 Excel 工作表中。由于床单不会改变,我需要先清除床单。

我的查询在底部。

注意 - 由于这种性质,我不能简单地将数据拉入 Excel。

UPDATE 似乎锁定了 Excel 文件。我可以多次运行插入而不会出现问题,但 UPDATE 会阻止进一步的操作实际更改文件。

  1. 运行更新:成功,工作表已清除
  2. 运行插入:失败 SQL 执行没有错误,但文件未填充

代码:

UPDATE OPENROWSET ('Microsoft.ACE.OLEDB.12.0',
                   'Excel 12.0;Database=C:\Workspace\WorkBook01.xlsx',
                   'SELECT col_01, col_01 FROM [Sheet1$]')
SET col_01 = NULL,
    col_02 = NULL
WHERE col_01 IS NOT NULL;

INSERT INTO OPENROWSET ('Microsoft.ACE.OLEDB.12.0',
                        'Excel 12.0;Database=C:\Workspace\WorkBook01.xlsx',
                        'SELECT col_01, col_02 FROM [Sheet1$]')
    SELECT col_01, col_01 
    FROM [dbo].[table_data];

编辑 - 附加细节 由于需要完成的任务的性质,使用了代码(文件结构不是我定义的,但我需要使用它)。要求概述如下:

  1. .xlsx 文件超过 30 个,所有文件都有 3 张或更多张
  2. 工作表中的行引用存储在每个文件中的“主数据”工作表(不是外部参考)
  3. 主数据表必须直接插入值(例如,不引用外部源)

我需要更新所有文件的“主数据”表(不使用外部参考)。使用上面的代码是因为我可以快速编写 SQL 脚本来对所有文件执行此操作。

注意 - 我知道如果“主表”只是从数据库中提取数据,或者如果它们都引用了一个外部文件,这会容易得多......这不是我的打电话,但我确实需要维护床单。

【问题讨论】:

  • 你可以使用 SSIS 吗? stackoverflow.com/questions/8018502/…
  • 如果您不先运行更新,您的插入是否按预期工作?如果是这样,您可以创建一个空白模板文件,然后在运行插入脚本之前将模板文件复制到现有文件上。
  • 你要插入多少行?
  • 是的,insert 工作正常,可以连续运行多次而不会出现问题。 update 有效,insert 表示之后成功,但工作表为空白(标题除外)
  • 你从未回答过@TabAlleman 的关于 SSIS 的问题。如果可能,我会使用 SSIS,如果没有,请考虑使用空白模板文件方法。另外,在什么情况下文件锁似乎被解除了?如果您在运行更新和插入之间延迟,它会起作用吗?

标签: sql sql-server excel openrowset


【解决方案1】:

答案有两个。最重要的是,据我所知,它无法做到。

  1. 无法通过OPENROWSET 删除行
  2. 将行的值设置为 NULL(空字符串默认为 NULL)会导致下一次插入出现问题,其中未插入数据(SQL 中未引发警告)。

这在此处进一步介绍:SQL Server: DELETE FROM OPENDATASOURCE

注意 - 链接中接受的答案说行可以“删除”;但是,根据我的经验,这会导致下一个INSERT 出错。

UPDATEINSERT 之前使用SELECT FROM OPENROWSET(...) 可以比在Excel 中更准确地查看分配的值(Excel 将NULL 显示为空行)。

【讨论】:

  • 解决方法 - 有一个(丑陋的)解决方法来解决这个问题。 1) 将“订单 ID”添加到 Excel 并使用 ROW NUMBER 生成结果 2) 将表结果转储到临时表中,并使用 ROW_NUMBER 生成“订单 ID”行3) LEFT JOINOPENROWSET 到基于“订单 ID”的表 4) 使用 IsNull 将缺失值默认为“0”或“x”5) 检查行数,如果 DB 表有更多行,使用WHERE order_id > @excl_count 插入它们 6) 将所有 Excel 文件包含在游标中以批量更新所有结果文件快速
【解决方案2】:

我无法理解您为什么会采用如此复杂的方法。您需要做的就是以 CSV 格式导出数据,然后使用 File->Open 将其读取到 excel 中。一个警告:Excel 将需要一个指定列名的初始行 - 再次,引用和逗号分隔:如果不存在,Excel 将简单地、静默地丢弃数据的第一行。

所以,你真正需要做的就是:

SPOOL 'wherever.xls'
SELECT DISTINCT("\"col1name\",\"col2name\",\"col3name") FROM ;
选择 "\"", col1name, "\",\"", col2name, "\",\"", col3name, "\"" FROM ;
假脱机;

【讨论】:

  • 谢谢你,我已经在我的原始帖子中添加了关于我为什么使用这种方法的详细信息。它是能够在不使用外部参考/源的情况下批量更新许多文件。
【解决方案3】:

对不起,如果我应该把这个放在评论而不是回答中,但我没有足够的分数。我认为您的逻辑没有任何问题,看起来更新为 NULL 对内容做了一些奇怪的事情。我用excel打开,然后清除了单元格。插入工作完美。

更新为 NULL 后,我使用 select 查看单元格内容,单元格显示为 NULL。然后我无法让插入物在那之后工作。

select * from openrowset('Microsoft.ACE.OLEDB.12.0', 
                        'Excel 12.0;Database=C:\junk\test.xlsx;',
                        'SELECT *  FROM [Sheet1$]')

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-27
    相关资源
    最近更新 更多