2016-07-06 114 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