如何从部署在64位服务器上的SSIS包访问Excel数据源?

我有一个SSIS包,可以将数据导出到一些Excel文件中传输给第三方。 为了让它在64位服务器上按计划运行,我知道我需要将该步骤设置为CmdExectypes,并调用32位版本的DTExec。 但是我似乎无法获得传递Excel文件连接string的命令。

到目前为止,我有这样的:

DTExec.exe /SQL \PackageName /SERVER OUR2005SQLSERVER /CONNECTION LETTER_Excel_File;\""Provider=Microsoft.Jet.OLEDB.4.0";"Data Source=""C:\Temp\BaseFiles\LETTER.xls";"Extended Properties= ""Excel 8.0;HDR=Yes"" /MAXCONCURRENT " -1 " /CHECKPOINTING OFF /REPORTING E 

这给了我错误: Option "Properties=Excel 8.0;HDR=Yes" is not valid.

我已经尝试了一些与引号的变化,但还没有得到它的权利呢。

有谁知道如何解决这一问题?

UPDATE:

感谢您的帮助,但我决定现在用CSV文件,因为他们似乎只是在64位版本。

这个循序渐进的例子适用于那些可能会偶然发现这个问题的人。 本示例使用SSIS 2005并使用SQL Server 2005 64位版本服务器来运行该作业。

这里的答案只集中于解决问题中提到的错误信息。 该示例将演示重新创build问题的步骤,以及如何解决问题的原因。

NOTE:我build议使用选项来将数据包configuration值存储在数据库中,或者在环境variables的帮助下使用间接XMLconfiguration。 此外,创buildExcel文件的步骤将使用模板来完成,然后通过移动到不同的文件夹进行归档。 这篇文章不讨论这些步骤。 如前所述,这篇文章的目的是解决这个错误。

让我们继续这个例子。 我也在这个链接中find了这个答案的博客。 这是相同的答案。

创build一个SSIS包(创build一个SSIS包的步骤 )。 这个例子使用了BIDS 2005.我已经在开始时以YYYYMMDD_hhmm的格式命名了包,SO代表Stack Overflow,后面是SO问题ID,最后是描述。 我不是说你应该这样命名你的包。 这对我来说很简单,稍后再回头介绍一下。 请注意,我也有一个名为Adventure Works的数据源。 我将使用Adventure Works数据源,该数据源指向从此链接下载的AdventureWorks数据库。 该示例使用SQL Server 2008 R2数据库。 请参阅截图#1

在AdventureWorks数据库中,使用下面给出的脚本创build一个名为dbo.GetCurrency的存储过程。

 CREATE PROCEDURE [dbo].[GetCurrency] AS BEGIN SET NOCOUNT ON; SELECT TOP 10 CurrencyCode , Name , ModifiedDate FROM Sales.Currency ORDER BY CurrencyCode END GO 

在程序包的连接pipe理器部分,右键单击并从数据源中select新build连接 。 在“ select数据源”对话框上,selectAdventure Works ,然后单击“确定”。 您现在应该可以在“ 连接pipe理器”部分下看到Adventure Works数据源。

在包的连接pipe理器部分,再次右键单击,但是这次select新build连接…。 这是创buildExcel连接。 在添加SSIS连接pipe理器上,selectEXCEL 。 在Excel连接pipe理器上,inputpathC:\ Temp \ Template.xls 。 当我们将其部署到服务器时,我们将改变这个path。 我已经select了Excel版本的Microsoft Excel 97-2005,并select了离开checkbox第一行有列名检查,以便创buildExcel文件创build列标题。 点击OK 。 重命名Excel连接到Excel ,只是为了保持简单。 请参阅截图#2#7

在包上,创build以下variables。 请参阅截图#8

  • SQLGetData :这个variables是Stringtypes的。 这将包含存储过程执行语句。 这个例子使用值EXEC dbo.GetCurrency

屏幕截图#9显示了存储过程执行语句EXEC dbo.GetCurrency的输出

在包的“控制stream”选项卡上,放置一个Data Flow task并将其命名为导出到Excel。 请参阅截图#10

双击数据stream任务切换到数据stream选项卡。

在“数据stream”选项卡上,放置一个OLE DB Source以连接到SQL Server数据,以从存储过程获取数据并将其命名为SQL。 双击OLE DB Source以调出OLE DB Source Editor。 在连接pipe理器部分,从OLE DB连接pipe理器中selectAdventure Works ,从数据访问模式的variables中selectSQL命令,然后从variables名称下拉列表中selectvariablesUser :: SQLGetData 。 在“列”部分中,确保列名称映射正确。 单击确定closuresOLE DB源编辑器。 请参阅截图#11#12

在“数据stream”选项卡上,放置Excel Destination以将数据插入到Excel文件中,并将其命名为Excel。 双击Excel目标以打开Excel目标编辑器。 在连接pipe理器部分,从OLE DB连接pipe理器中selectExcel并select表或从数据访问模式查看。 在这一点上,我们没有Excel,因为在创buildExcel连接pipe理器时,我们只是指定了path,却从来没有创build过这个文件。 因此,Excel工作表的下拉列表中将不会有任何值。 所以,点击New …button(第二个Newbutton)来创build一个新的Excel工作表。 在“创build表格”窗口中,BIDS将自动提供基于传入数据源的创build工作表。 您可以根据自己的喜好更改值。 我将通过保留默认值来简单地单击确定。 工作表的名称将填充在Excel工作表的下拉列表中。 工作表的名称取自任务名称,在这里是Excel Destination,我们将其命名为Excel。 在映射部分,确保列名称映射正确。 单击确定closuresExcel目标编辑器。 请参阅截图#13#16

一旦数据stream任务被configuration,它应该看起来像截屏#17所示。

按F5执行包。 屏幕截图#18#21显示了控制stream和数据stream任务中程序包的成功执行。 此外,该文件是在Excel连接中提供的pathC:\ Temp \ Template.xls中生成的,存储过程执行输出中显示的数据与写入文件的数据相匹配。

在我的本地机器上开发的文件夹在文件夹pathC:\ Learn \ Learn.VS2005 \ Learn.SSIS中 。 现在,我们需要将这些文件部署到承载64位版本SQL Server的服务器上以安排作业。 所以,服务器上的文件夹将是D:\ SSIS \ Practice 。 从本地机器复制包文件( .dtsx )并将其粘贴到服务器文件夹中。 另外,为了使包正确运行,我们需要在服务器上显示Excel电子表格。 否则,validation将失败。 通常,我创build一个模板文件夹,其中将包含与输出匹配的空Excel电子表格文件。 稍后,在运行期间,我将使用软件包configuration将Excel输出path更改为其他位置。 对于这个例子,我将保持简单。 所以,让我们将本地机器中生成的Excel文件复制到pathC:\ Temp \ Template.xls中的服务器位置D:\ SSIS \ Practice中 。 我希望SQL作业生成名为Currencies.xls的文件。 所以,将文件Template.xls重命名为Currencies.xls 。 请参阅截图#22

为了certificate我确实要在64位版本的SQL Server上运行服务器上的作业,我在SQL Server上执行了SELECT @@版本的命令,屏幕截图#23显示了结果。

我们将使用执行包实用程序 (dtexec.exe)来生成命令行参数。 login到将在SQL作业中运行SSIS包的服务器。 双击包文件,这将带来执行包实用程序。 在常规部分中,从软件包源文件中select文件系统。 点击省略号并浏览到包path。 在连接pipe理器部分,selectExcel并将Excel文件中的path从C:\ Temp \ Template.xls更改为D:\ SSIS \ Practice \ Currencies.xls。 在实用程序中所做的更改将在命令行部分相应地生成命令行。 在命令行部分,复制包含所有必要参数的命令行。 我们不打算从这里执行包。 点击closures 。 请参阅截图#24#26

接下来,我们需要build立一个工作来运行SSIS包。 我们不能selectSQL Server集成服务包types,因为它将在64位下运行,并且不会findExcel连接提供程序。 所以,我们必须将其作为Operating System (CmdExec)作业types来运行。 转到SQL Server Management Studio并连接到数据库引擎。 展开SQL Server代理并右键单击作业节点。 select新的工作…。 在“作业属性”窗口的“常规”部分,将作业名称提供为01_SSIS_Export_To_Excel,所有者将是创build作业的用户。 我有一个名为SSIS的类别,所以我会select它,但默认类别是[未分类(本地)],并提供简要说明。 在步骤部分,单击新build…button。 这将带来作业步骤属性。 在“作业步骤”属性的“常规”部分中,提供步骤名称作为导出到Excel,selecttypesOperating system (CmdExec) ,将默认运行方式帐户保留为SQL Server代理服务帐户,并提供以下命令。 点击OK。 在新build作业窗口上,单击确定。 请参阅截图#27#31

 C:\Program Files (x86)\Microsoft SQL Server\90\DTS\Binn\DTExec.exe /FILE "D:\SSIS\Practice\20110723_1015_SO_21448_Excel_64_bit_Error.dtsx" /CONNECTION Excel;"\"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:\SSIS\Practice\Currencies.xls;Extended Properties=""EXCEL 8.0;HDR=YES"";\"" /MAXCONCURRENT " -1 " /CHECKPOINTING OFF /REPORTING EWCDI 

新作业应显示在“SQL Server代理 – >作业”节点下。 右键单击新创build的作业01_SSIS_Export_To_Excel并select开始作业(步骤…) ,这将开始作业执行。 这个工作将会如预期的那样失败,因为这是这个问题的背景。 单击closuresclosures“开始作业”对话框。 请参阅截图#32#33

我们来看看发生了什么事。 转到SQL Server代理和作业节点。 在作业01_SSIS_Export_To_Excel上单击鼠标右键,然后select查看历史logging。 这将带来日志文件查看器窗口。 你可以注意到这个工作失败了。 展开红十字附近的节点,然后单击Step ID值为1的行。在底部,可以看到错误消息Option “8.0;HDR=YES';” is not valid. 单击closuresclosures日志文件查看器窗口。 请参阅截图#34#35

现在,右键单击作业并select“属性”以打开“作业属性”。 您也可以双击作业以启动“作业属性”窗口。 点击左侧的步骤。 并点击编辑。 将命令replace为以下命令,然后单击确定。 在“作业属性”上单击“确定”closures窗口。 在作业01_SSIS_Export_To_Excel上单击鼠标右键,然后select步骤…中的开始作业,这将开始作业执行。 作业将成功执行失败。 单击closuresclosures“开始作业”对话框。 让我们来看看历史。 在作业01_SSIS_Export_To_Excel上单击鼠标右键,然后select查看历史logging。 这将带来日志文件查看器窗口。 您可以注意到在第二次运行期间作业成功了。 展开靠近绿色勾号十字的节点,并点击Step ID值为1的行。在底部,您可以看到消息Option。步骤成功。 单击closuresclosures日志文件查看器窗口。 文件D:\ SSIS \ Practice \ Currencies.xls将被成功填充数据。 如果您多次成功执行作业,数据将被追加到文件中,您将find更多数据。 正如我前面提到的,这不是生成文件的正确方法。 创build此示例是为了演示此问题的解决方法。 请参阅截图#36#38

屏幕截图#39显示了工作和非工作命令行参数之间的区别。 右边的是工作命令行,左边的是不正确的。 它需要另外一个带有反斜杠转义序列的双引号来修复错误。 可以有其他的方法来解决这个问题,但这个选项似乎工作。

因此,该示例演示了在从64位服务器上部署的SSIS包访问Excel数据源时解决命令行参数问题的方法。

希望能帮助别人。

截图:

#1: Solution_Explorer

Solution_Explorer

#2: New_Connection_Data_Source

New_Connection_Data_Source

#3: Select_Data_Source

Select_Data_Source

#4: New_Connection

New_Connection

#5: Add_SSIS_Connection_Manager

Add_SSIS_Connection_Manager

#6: Excel_Connection_Manager

Excel_Connection_Manager

#7: Connection_Managers

Connection_Managers

#8:variables

变量

#9: Stored_Procedure_Output

Stored_Procedure_Output

#10: Control_Flow

在这里输入图像说明

#11: OLE_DB_Source_Connections_Manager

OLE_DB_Source_Connections_Manager

#12: OLE_DB_Source_Columns

OLE_DB_Source_Columns

#13: Excel_Destination_Editor_New

Excel_Destination_Editor_New

#14: Excel_Destination_Create_Table

Excel_Destination_Create_Table

#15: Excel_Destination_Edito

Excel_Destination_Edito

#16: Excel_Destination_Mappings

Excel_Destination_Mappings

#17: Data_Flow

数据流

#18: Successful_Package_Execution_Control

Successful_Package_Execution_Control

#19: Successful_Package_Execution_Data_Flow

Successful_Package_Execution_Data_Flow

#20: C_Temp_File_Created

C_Temp_File_Created

#21: Data_Populated

Data_Populated

#22: File_On_Server

File_On_Server

#23: SQL_Server_Version

SQL_Server_Version

#24: Execute_Package_Utility_General

Execute_Package_Utility_General

#25: Execute_Package_Utility_Connection_Managers

Execute_Package_Utility_Connection_Managers

#26: Execute_Package_Utility_Command_Line

Execute_Package_Utility_Command_Line

#27: Job_New_Job

Job_New_Job

#28: New_Job_General

New_Job_General

#29: New_Job_Step

New_Job_Step

#30: New_Job_Step_General

New_Job_Step_General

#31: New_Job_Steps_Added

New_Job_Steps_Added

#32: Job_Start_Job_at_Step

Job_Start_Job_at_Step

#33: SQL_Job_Execution_Failure

SQL_Job_Execution_Failure

#34: View_History

View_History

#35: SQL_Job_Error_Message

SQL_Job_Error_Message

#36: SQL_Job_Execution_Success

SQL_Job_Execution_Success

#37: SQL_Job_Success_Message

SQL_Job_Success_Message

#38: Excel_File_Generated

Excel_File_Generated

#39: Command_Comparison

39_Command_Comparison

您可以在64位环境中使用Excel连接。 转到包configuration属性。

debugging – >debugging选项 – > Run64BtRuntime – >更改为False此外,如果您使用SQL代理转到作业步骤属性,然后检查32位运行时。

注意:这只适用于Visual Studio中的debugging…

没有64位Jet OLEDB提供程序,因此无法从64位SSIS访问Excel文件。

但是,即使在64位服务器上也可以使用32位SSIS。 它已经安装,当您安装64位版本,并且所有您需要做的是运行32位DTEXEC.EXE – 一个安装Program Files (x86)\Microsoft Sql Server\90\Dts\Binn (用90replace100如果你正在使用SSIS 2008)。

除非是业务需求,否则我build议您将连接string从命令行移动到包,并使用包configuration来定义Excel文件的path(以便不对其进行硬编码)。 这将使维护更容易。

  1. 定义一个variables@ExcelPath
  2. 使用连接的Expression属性来构造连接string – 例如: "Data Source=" + @[User::FilePath] + ";Provider=Microsoft.Jet.OLEDB.4.0;Extended Properties=dBASE IV;"
  3. 在包configuration中为@ExcelPath分配一个值。

仔细看看上面的连接string。 这是来自一个工作包。 我不确定这一点,但也许你根本不需要任何引号(上面的那些只是因为expression式编辑器的需要)。


我在64位SQL Server 2005上也遇到了一些SSIS问题。从我的博客发表的这个post并没有回答你的问题,但是它有点相关,所以我发布了这个链接。

我有点做了什么Zim博士,但我复制DTExec文件C:\Program Files (x86)\Microsoft SQL Server\90\DTS\Binn\DTExec.exeC:\Program Files\Microsoft SQL Server\90\DTS\Binn\文件夹,但将其命名为DTExec32.exe

那么我可以通过存储过程运行我的SSIS脚本:

 set @params = '/set \package.variables[ImportFilename].Value;"\"' + @FileName + '\"" ' set @cmd = 'dtexec32 /SQ "' + @packagename + ' ' + @params + '"' --DECLARE @returncode int exec master..xp_cmdshell @cmd --exec @returncode = master..xp_cmdshell @cmd --select @returncode