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

时间:2008-08-21 23:42:40

标签: sql-server excel ssis

我有一个SSIS包,可以将数据导出到几个Excel文件,以便传输给第三方。为了使它在64位服务器上作为预定作业运行,我理解我需要将步骤设置为CmdExec类型并调用32位版本的DTExec。但我似乎无法使命令正确传递Excel文件的连接字符串。

到目前为止,我有这个:

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位版本。

5 个答案:

答案 0 :(得分:8)

答案 1 :(得分:4)

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

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

注意:这仅适用于Visual Studio中的调试...

答案 2 :(得分:2)

除非是业务需求,否则我建议您将连接字符串从命令行移动到包,并使用包配置来定义Excel文件的路径(以便不对其进行硬编码)。这样可以更容易维护。

  1. 定义变量 @ExcelPath
  2. 使用连接的 Expression 属性构建连接字符串 - 示例:"Data Source=" + @[User::FilePath] + ";Provider=Microsoft.Jet.OLEDB.4.0;Extended Properties=dBASE IV;"
  3. 在程序包配置中为 @ExcelPath 分配值。

  4. 仔细查看上面的连接字符串。它来自一个工作包。我不确定这一点,但也许你根本不需要任何引号(上面那些只是因为表达式编辑器需要它们)。


    I have also had some problems with SSIS on 64-bit SQL Server 2005.我博客上的帖子没有回答你的问题,但它有些相关,所以我发帖链接。

答案 3 :(得分:2)

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

但是,即使在64位服务器上也可以使用32位SSIS。安装64位版本时已经安装了它,您需要做的就是运行32位DTEXEC.EXE - 安装的Program Files (x86)\Microsoft Sql Server\90\Dts\Binn(用替换 90 100 如果您使用的是SSIS 2008)。

答案 4 :(得分:0)

我有点做了Zim博士的做法,但我将DTExec文件C:\Program Files (x86)\Microsoft SQL Server\90\DTS\Binn\DTExec.exe复制到C:\Program Files\Microsoft SQL Server\90\DTS\Binn\文件夹,但将32位命名为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