2016-07-06 111 views
0

我需要将数据从SQL Server 2014推送到Excel工作表中。由于纸张不会改变,我需要先清理纸张。SQL Server - 清除和填充Excel

我的查询在底部。

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

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

  1. 运行update:成功,单是清除
  2. 运行INSERT:失败的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]; 

编辑 - 其他细节 该代码是由于ta的性质使用sk需要完成(文件结构没有被我定义,但我需要使用它)。的要求概述如下:

  1. 有超过30 .XLSX文件,所有这些具有3个或更多个片材横跨片
  2. 行引用存储在每个文件(不包括外部“主数据”片材参考)
  3. 主数据片必须具有直接插入(例如不引用外部源的值)

我需要更新所有文件(“主数据”表,而无需使用外部基准)。使用上面的代码是因为我可以快速编写SQL来为所有文件执行此操作。

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

+2

你可以使用SSIS吗? http://stackoverflow.com/questions/8018502/how-to-overwrite-excel-destination-in-ssis –

+0

如果您不首先运行更新,您的插入是否按预期工作?如果是这样,您可以创建一个空白模板文件,并在运行插入脚本之前将模板文件复制到现有文件上。 –

+0

您插入了多少行? – Eric

回答

0

我无法理解为什么你会采用这种复杂的方法。您只需要以CSV格式导出数据,然后使用File-> Open将其读入Excel。需要注意的一点是:Excel会指定一个指定列名的初始行 - 再次用引号和逗号分隔:如果缺失,Excel将简单地静静地丢弃第一行数据。

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

SPOOL 'wherever.xls'
SELECT DISTINCT( “\” col1name \”,\ “col2name \”,\ “col3name”)FROM < anyTableWillDo>;
SELECT “\” “col1name, ”\“,\ ”“,col2name, ”\“,\ ”“,col3name, ”\“” FROM < yourSubjectTable>;
SPOOL OFF;

+0

谢谢你,我已经添加到我的原始文章的细节,关于为什么我正在使用该方法。它能够批量更新许多文件而无需使用外部参考/来源。 – EAB769

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$]') 
2

答案是两倍。底线是我不能说的,据我所知。

  1. 行不能通过OPENROWSET
  2. 被删除对NULL设定一个行的值(空字符串默认为NULL)会导致一个问题,与其中的数据没有插入下一个插入(在SQL提出警告)。

这进一步覆盖在这里:SQL Server: DELETE FROM OPENDATASOURCE

注意 - 链路中接受的答案说,行可以被“隐没”;然而,根据我的经验,这会导致下一个INSERT错误。

UPDATEINSERT之前使用SELECT FROM OPENROWSET(...)可以更准确地查看Excel中指定的值而不是可视的值(Excel将NULL显示为空行)。

+0

解决 - 这个问题有一个(丑陋的)解决方法。 ** 1)**将一个'订单ID'添加到Excel中,并以'ROW NUMBER'结果** 2)**将表结果转储到临时表中,其中'订单ID'行由'ROW_NUMBER'生成** 3)* *'从'OPENROWSET'的LEFT JOIN基于'Order ID'** 4)**使用'IsNull'将缺失值默认为'0'或'x'** 5)**检查行数if数据库表有更多的行,使用'WHERE order_id> @ excl_count'插入它们** ** 6)**在光标中包含所有Excel文件以快速批量更新所有文件中的结果 – EAB769