我需要将SQL Server 2014中的数据推送到Excel工作表中。由于床单不会改变,我需要先清理床单。
我的疑问在底部。
注意 - 由于其性质,我不能简单地将数据拉入Excel。
UPDATE似乎锁定了Excel文件。我可以多次运行插入而没有问题,但UPDATE阻止进一步的操作实际更改文件。
代码:
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];
编辑 - 添加其他详细信息 由于需要完成任务的性质而使用代码(文件结构不是由我定义的,但我需要使用它)。要求概述如下:
我需要在所有文件中更新“主数据”表(不使用外部引用)。使用上面的代码是因为我可以快速编写SQL脚本以对所有文件执行此操作。
注意 - 我知道如果“主表”只是从数据库中提取数据,或者如果它们都引用了一个外部文件,这将更容易...这不是我的打电话,但我确实需要保持床单。
答案 0 :(得分:2)
答案是双重的。最重要的是,据我所知,它无法完成。
OPENROWSET
NULL
(空字符串默认为NULL
)会导致下一个插入未插入数据的问题(SQL中没有出现警告)。< / LI>
醇>
此处进一步介绍了这一点:SQL Server: DELETE FROM OPENDATASOURCE
注意 - 链接中接受的答案表示行可以被删除&#34 ;;但是,根据我的经验,这会导致下一个INSERT
出错。
在SELECT FROM OPENROWSET(...)
和UPDATE
之前使用INSERT
可以更准确地查看分配的值,而不是Excel中可见的值(Excel将NULL显示为空行)。
答案 1 :(得分:0)
我无法理解为什么你会采用这种复杂的方法。您需要做的就是以CSV格式导出数据,然后使用File-&gt; Open将其读入excel。需要注意的是:Excel会指望一个指定列名的初始行 - 再次引用和逗号分隔:如果不存在,Excel将简单地,静默地丢弃数据的第一行。
所以,你真正需要做的就是:
SPOOL'herever.xls'
SELECT DISTINCT(“\”col1name \“,\”col2name \“,\”col3name“)FROM&lt; anyTableWillDo&gt ;;
选择“\”“,col1name,”\“,\”“,col2name,”\“,\”“,col3name,”\“”
FROM&lt; yourSubjectTable取代;
SPOOL OFF;
答案 2 :(得分:0)
很抱歉,如果我把它放在评论中而不是回答,但我没有足够的积分。我认为你的逻辑没有任何问题,看起来像对NULL的更新正在对内容做一些奇怪的事情。我用excel打开,然后清理了细胞。插件工作完美。
我使用select来查看更新后的单元格内容为NULL,并且单元格显示为NULL。然后我就无法让插件工作了。
select * from openrowset('Microsoft.ACE.OLEDB.12.0',
'Excel 12.0;Database=C:\junk\test.xlsx;',
'SELECT * FROM [Sheet1$]')