【发布时间】:2016-07-06 17:45:47
【问题描述】:
我需要将数据从 SQL Server 2014 推送到 Excel 工作表中。由于床单不会改变,我需要先清除床单。
我的查询在底部。
注意 - 由于这种性质,我不能简单地将数据拉入 Excel。
UPDATE 似乎锁定了 Excel 文件。我可以多次运行插入而不会出现问题,但 UPDATE 会阻止进一步的操作实际更改文件。
- 运行更新:成功,工作表已清除
- 运行插入:失败 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];
编辑 - 附加细节 由于需要完成的任务的性质,使用了代码(文件结构不是我定义的,但我需要使用它)。要求概述如下:
- .xlsx 文件超过 30 个,所有文件都有 3 张或更多张
- 工作表中的行引用存储在每个文件中的“主数据”工作表(不是外部参考)
- 主数据表必须直接插入值(例如,不引用外部源)
我需要更新所有文件的“主数据”表(不使用外部参考)。使用上面的代码是因为我可以快速编写 SQL 脚本来对所有文件执行此操作。
注意 - 我知道如果“主表”只是从数据库中提取数据,或者如果它们都引用了一个外部文件,这会容易得多......这不是我的打电话,但我确实需要维护床单。
【问题讨论】:
-
你可以使用 SSIS 吗? stackoverflow.com/questions/8018502/…
-
如果您不先运行更新,您的插入是否按预期工作?如果是这样,您可以创建一个空白模板文件,然后在运行插入脚本之前将模板文件复制到现有文件上。
-
你要插入多少行?
-
是的,
insert工作正常,可以连续运行多次而不会出现问题。update有效,insert表示之后成功,但工作表为空白(标题除外) -
你从未回答过@TabAlleman 的关于 SSIS 的问题。如果可能,我会使用 SSIS,如果没有,请考虑使用空白模板文件方法。另外,在什么情况下文件锁似乎被解除了?如果您在运行更新和插入之间延迟,它会起作用吗?
标签: sql sql-server excel openrowset