【问题标题】:SQL Server- VBScript: VBScript to open Excel file failed in SQL Job?SQL Server-VBScript:在 SQL 作业中打开 Excel 文件的 VBScript 失败?
【发布时间】:2012-05-22 20:27:06
【问题描述】:

参考vbScript opens up excel but doesn't load macro/modules?

现在我尝试从 SQL 作业运行我的 vbscript。虽然我成功执行了作业,但它没有打开我的 excel 文件(检查任务计划程序)。我去查看这个工作的历史,发现

消息 以用户身份执行:GSOPS4\SYSTEM。 Microsoft (R) Windows Script Host 版本 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 文件)的任何线索都将受到高度赞赏。谢谢大家的建议!

有什么想法吗?

【问题讨论】:

  • 您真的要使用 VBS 从 SQL Server 作业打开 Excel 吗?为什么?任何需要任何类型的对话框或 UI 的东西都不能在 SQL Server 中正常工作。您还应该检查您的路径,`\gsops4\...` 似乎不正确。
  • 我敢打赌这是权限错误。但是@AaronBertrand 有第一个问题,没有有效的路径。除非该文件位于 C:\gsops4\data_extracts 中,即使如此,通常也始终指定完整路径。
  • 一般来说,如果可能的话,我会尽量避免在任何无头进程中涉及 EXCEL.EXE。有关从电子表格中提取数据的替代方法的一些建议,请参阅下面的答案。
  • @Aaron- 我的 Excel vba 代码是完全自动化的,根本不需要人工干预。我运行 vbScript 代码以通过命令行成功执行我的 excel vba。文件路径存在。想知道我无法从 SQL 作业访问操作系统资源。我什至尝试创建代理帐户并使用它来访问文件路径但失败了。
  • @Nemo \gsops4\ 是什么文件路径?不应该是\\gsops4\ 吗?或者更好的是本地路径(因为尝试通过网络执行此操作只是让您陷入痛苦的另一个变量)?

标签: excel vba sql-server-2008 vbscript sql-job


【解决方案1】:

另一种观点

Excel 非常擅长在控制台上弹出对话框然后挂起直到用户操作它们。这在服务器上是非常的坏事,因为它会冻结进程并泄漏正在运行的 excel 实例。它还要求您在服务器本身上安装 excel。

通常,您最好通过代理安排 SSIS 作业,该代理通过 OLEDB 驱动程序读取电子表格,然后在服务器端作业上复制计算。宏到底是做什么的?

我在这一天从 Excel 源中完成了一些 ETL 工作,并且 (IMO) 处理来自 excel 的数据的最佳方法是避免不惜一切代价调用 EXCEL.EXE。悬空 COM 引用非常挑剔,因此您必须非常小心地处理所有创建的 COM 对象。在某些情况下,默认引用(工作表、工作簿、范围等)会在幕后创建不透明的引用,您实际上无法以编程方式整理这些引用,因为类型库没有公开任何这样做的工具。

.NET 主要互操作程序集为此增加了额外的复杂性,因为它们生成了自己的引用,这些引用也必须明确地进行整理。 COM 和 .Net 之间存在显着的阻抗不匹配 - 以至于已经写了几本关于使 COM 和 .Net 组件很好地协同工作的书籍。

幸运的是,WSH 不涉及 .Net,但我不建议在 DBMS 中执行 Excel COM 服务器上的 COM 远程处理。

两种更安全的方法

  1. 在 OLEDB 驱动程序中打开工作簿 - 将工作表读入临时表,然后从那里提取数据表格。这甚至不需要在服务器上安装 Excel,而且非常健壮。

  2. 解开 .xlsx zip 文件并从中取出工作表 - 这实际上比您想象的要好。 sheetxx.xml 文件的格式相当简单,您可能需要的唯一其他东西是sharedStrings.xml。通常,如果您有可用的 SSIS,则不需要对 SQL Server 执行此操作,但如果您在非 Windows 主机上使用(例如)Oracle,这将是一个非常有用的技巧。

编辑: 为了通过 OLE 自动化使用 Excel,您需要在运行它的机器上安装 Excel。一般来说,将 Excel 安装在服务器上并不是一个好计划,因为它不是特别安全。它也是一个桌面工具,如果您没有在您的 I 上加上 T 并在您的 COM 引用创建和处置中交叉,它有泄漏 COM 引用和运行 Excel 实例的趋势。

SSIS 有一个 excel 数据源。您可以通过在 BIDS 中创建 SSIS 项目并创建新的连接管理器来查看它。 Excel 是您的选择之一。

但是,如果您需要查询共享点列表,则最好完全不使用 Excel 以编程方式查询它。一点 google-fu 应该会出现一些如何做到这一点的例子,例如here.。您可以通过独立的 .Net 应用程序或通过 SSIS 包中的脚本任务执行此操作(脚本任务是您可以在 SSIS 包中构建的 .Net 自定义任务)。

如果您这样做,您最好在 SSIS 之外开发它(如果没有任何其他选项,请使用 Visual C# Express),然后将其移植到脚本任务。如果您熟悉 Python,IronPython 或 Boo 是很好的工具,它们可以交互地使用 .Net API 来让某些东西正常工作。

【讨论】:

  • 宏到底是做什么的?它刷新 iqy 数据并将其泵入 Activesheet。生成 iqy 以获取 SharePoint 列表数据。从该 iqy 文件获取刷新数据到 Excel 的过程必须自动化。自动化已完成,但是需要从 SQL 作业运行此 vbs 脚本文件,因为自动化的另一半(将 excel 提供给报告生成器)来自 SQL 作业。我想知道在服务器本身上安装 excel 是什么意思?它能解决我的问题吗?
  • 我对#1 更安全的方法很感兴趣。我对SSIS相当陌生。你能指出我正确的方向吗?谢谢。
  • @Nemo - 有关 Excel 的详细说明,请参见上文。
  • 感谢您的建议。我想知道如果要从 SharePoint 列表读取的控制台应用程序将从 SharePoint Server 运行,那么我可以使用 SharePoint 对象模型。我无权访问 SharePoint 服务器,除非我有权访问 SharePoint 服务器的 URL。因此,如果我打算从没有 SharePoint 的计算机上运行控制台应用程序,那么我应该使用 Web 服务。因此,我使用 Web 服务访问 SharePoint 列表并获取用户从功能区导出到 excel 时获取的 iqy 文件。如果我说得对,请告诉我?
  • 您应该能够通过 Web 服务查询 SP 服务器 - 对于服务器端进程,最好通过 .Net 而不是 Excel。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-30
  • 1970-01-01
  • 1970-01-01
  • 2014-08-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多