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

时间:2020-03-05 18:41:50  来源:igfitidea点击:

我有一个SSIS包,可以将数据导出到几个Excel文件中以传输给第三方。为了使它能够在64位服务器上作为计划的作业运行,我了解我需要将该步骤设置为CmdExec类型,并调用DTExec的32位版本。但是我似乎无法正确地传递命令来传递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

这给了我错误:选项" Properties = Excel 8.0; HDR = Yes"无效。

我已经尝试了一些带引号的变体,但还无法正确解决。

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

更新:

感谢帮助,但由于它们似乎仅适用于64位版本,因此我现在决定使用CSV文件。

解决方案

回答

除非有业务要求,否则建议我们将连接字符串从命令行移至程序包,并使用程序包配置定义Excel文件的路径(以免对其进行硬编码)。这将使其更易于维护。

  • 定义一个变量@ExcelPath。
  • 使用连接的Expression属性构造连接字符串-例如:""数据源=" + @ [User :: FilePath] +"; Provider = Microsoft.Jet.OLEDB.4.0; Extended Properties = dBASE IV;"
  • 在程序包配置中为@ExcelPath分配一个值。

仔细看看上面的连接字符串。它是从一个工作包中提取的。我对此不确定,但是也许我们根本不需要任何引号(上面的引号仅存在,因为表达式编辑器需要它们)。

我在64位SQL Server 2005上的SSIS也遇到了一些问题。我博客中的帖子没有回答问题,但是有些相关,因此我发布了链接。

回答

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

但是,即使在64位服务器上,我们也可以使用32位SSIS。当我们安装64位版本时,它已经安装了,我们需要做的就是运行32位DTEXEC.EXE,其中一个已安装了"程序文件(x86)\ Microsoft Sql Server \ 90 \ Dts \ Binn`(替换90如果我们使用的是SSIS 2008,则为100)。

回答

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

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

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

回答

我有点像Zim博士所做的那样,但是我将DTExec文件C:\ Program Files(x86)\ Microsoft SQL Server \ 90 \ DTS \ Binn \ DTExec.exe复制到C:\ Program Files \ Microsoft SQL Server \ 90 \ DTS \ Binn \文件夹,但将32位1命名为DTExec32.exe

然后我就可以通过存储的proc运行我的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