SQL Server - 清除和填充Excel

时间:2016-07-06 17:45:47

标签: sql sql-server excel openrowset

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

我的疑问在底部。

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

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

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

    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. 有超过30个.xlsx文件,所有文件都有3张或更多张
    2. 工作表中的行引用存储在每个文件中的“主数据”表(不是外部引用)
    3. 主数据表必须具有直接插入的值(例如,不引用外部源)
    4. 我需要在所有文件中更新“主数据”表(不使用外部引用)。使用上面的代码是因为我可以快速编写SQL脚本以对所有文件执行此操作。

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

3 个答案:

答案 0 :(得分:2)

答案是双重的。最重要的是,据我所知,它无法完成。

  1. 无法通过OPENROWSET
  2. 删除行
  3. 将行的值设置为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$]')