2012-05-22 87 views
1

參考vbScript opens up excel but doesn't load macro/modules?SQL Server- VBScript:在SQL Job中打開Excel文件失敗的VBScript?

現在我試圖從SQL作業運行我的VBScript。儘管我成功地執行了Job,但它並沒有打開我的Excel文件(Checked Task Scheduler)。我去查看這項工作的歷史,發現

消息 作爲用戶執行:GSOPS4 \ SYSTEM。 Microsoft(R)Windows腳本宿主版本5.7版權所有(C)Microsoft Corporation。保留所有權利。C:\ WINDOWS \ system32 \ TestTOPTMay307.vbs(5,1)Microsoft Excel:Microsoft Excel無法訪問文件'\ gsops4 \ data_extracts \ TestTOPTMay307.xlsm'。有幾種可能的原因:文件名或路徑不存在。該文件正在被另一個程序使用。您嘗試保存的工作簿與當前打開的工作簿具有相同的名稱。處理退出代碼0.步驟成功。

我也跟着在這個線程Run a C# Console Application from SQL Server Agent (Job)?

但是我無法得到它的工作的建議。這件事在過去的48小時裏一直令我煩惱。任何線索是什麼導致它,以及如何成功地執行我的工作(從SQL運行我的VBScript文件)將不勝感激。謝謝大家!

有什麼想法?

+3

您是否真的想使用VBS從SQL Server作業打開Excel?爲什麼?任何需要任何類型的對話或UI的東西都不能很好地從SQL Server中運行。你也應該檢查你的路徑,'\ gsops4 \ ... \'似乎不正確。 –

+1

我敢打賭,這是一個權限錯誤。但@AaronBertrand有第一個問題,沒有一個有效的路徑。除非該文件位於C:\ gsops4 \ data_extracts中,即使這樣,通常也要指定完整路徑。 – jcolebrand

+0

通常我會盡量避免在任何無頭過程中涉及EXCEL.EXE。有關從電子表格中提取數據的替代方法的一些建議,請參閱下面的答案。 – ConcernedOfTunbridgeWells

回答

3

另一種觀點

Excel是在控制檯上彈出對話框,然後掛,直到它們被用戶付諸行動很不錯。這是服務器上的一個壞東西,因爲它會凍結進程並泄漏正在運行的Excel實例。它還要求你在服務器上安裝excel。

通常情況下,通過OLEDB驅動程序讀取電子表格並在服務器端作業上覆制計算的代理程序,通過代理程序安排SSIS作業要好得多。宏究竟做了什麼?

我在Excel日誌中完成了一些ETL工作,並且(IMO)處理excel數據的最佳方法是避免不惜一切代價調用EXCEL.EXE。對於懸掛COM引用非常挑剔,所以你必須非常小心地處理所有創建的COM對象。在某些情況下,默認引用(Worksheet,Workbook,Range等)會在幕後創建不透明的引用,因爲類型庫不會公開任何工具。

.NET主互操作程序集爲此添加了額外的複雜性,因爲它們生成的自己的引用也必須明確地整理。在COM和.Net之間存在顯着的阻抗不匹配問題 - 就如何編寫幾本關於使COM和.Net組件良好結合在一起的書籍而言。

幸運的是,WSH並不涉及.Net,但COM COM遠程處理Excel COM服務器並不是我會推薦在DBMS中執行的操作。

兩個安全得多接近

  1. 開啓在所述OLEDB驅動器工作簿 - 讀片材到一個臨時表,然後提取數據形式存在。這甚至不需要在服務器上安裝Excel,而且非常健壯。

  2. 解開。xlsx壓縮文件並從中獲取工作表 - 這實際上比您想象的更好。 sheetxx.xml文件格式相當簡單,您可能需要的唯一其他內容是sharedStrings.xml。通常,如果您有SSIS,則不需要在SQL Server上執行此操作,但如果您在非Windows主機上使用(比如說)Oracle,則這是非常有用的技巧。

編輯: 爲了通過你需要有你運行它的計算機上安裝Excel OLE自動化使用Excel。通常,將Excel安裝在服務器上並不是一個好計劃,因爲它不是特別安全。這也是一個桌面工具,並且如果你沒有點擊你的I,並且通過你的COM參考創建和處理來交叉你的T,它就會泄漏COM引用並運行Excel實例。

SSIS有一個excel數據源。您可以通過在BIDS中創建SSIS項目並創建新的連接管理器來查看它。你的選擇之一是Excel。

但是,如果您需要查詢SharePoint列表,則最好不要使用Excel編程式地查詢它。 google-fu應該舉例說明如何做到這一點,例如here.。您可以通過獨立的.Net應用程序或通過SSIS包中的腳本任務來執行此操作(腳本任務是可以在SSIS包中構建的.Net自定義任務)。

如果你這樣做,你可能最好在SSIS之外開發它(如果沒有其他選項,請使用Visual C#Express),然後將它移植到腳本任務中。如果你對Python很熟悉,IronPython或者Boo是交互式地使用.Net API進行工作的好工具。

+0

這個宏究竟做了什麼?它刷新iqy數據並將其輸入到Activesheet中。生成iqy以獲取SharePoint列表數據。從iqy文件更新數據到Excel的過程必須自動進行。自動化已完成,但是需要從SQL作業運行此VBS腳本文件,因爲另一半自動化(提供Excel報告生成器)來自SQL作業。我想知道在服務器上安裝excel是什麼意思?它會解決我的問題嗎? – Nemo

+0

我對#1更安全的方法感興趣。我對SSIS相當陌生。你能指點我正確的方向嗎?謝謝。 – Nemo

+0

@Nemo - 請參閱上面關於Excel的詳細說明。 – ConcernedOfTunbridgeWells