我有一个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位版本。

===============>>#1 票数:8

这个分步示例适用于可能偶然发现此问题的其他人。 此示例使用SSIS 2005并使用SQL Server 2005 64位版本服务器来运行作业。

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

NOTE:我建议使用在数据库中存储包配置值的选项,或在环境变量的帮助下使用间接XML配置。 此外,创建Excel文件的步骤将使用模板完成,然后通过移动到其他文件夹进行存档。 本文不讨论这些步骤。 如前所述,这篇文章的目的是解决错误。

让我们继续这个例子。 我也在博客上写了这个答案,可以在这个链接中找到。 这是同样的答案。

创建SSIS包(创建SSIS包的步骤 )。 这个例子使用BIDS 2005.我在开头的YYYYMMDD_hhmm格式中命名了包,然后是SO代表Stack Overflow,接着是SO问题id,最后是描述。 我不是说你应该像这样命名你的包裹。 这对我来说很容易在以后再提到。 请注意,我还有一个名为Adventure Works的数据源。 我将使用Adventure Works数据源,它指向从此链接下载的AdventureWorks数据库。 该示例使用SQL Server 2008 R2数据库。 请参阅截图#1

在AdventureWorks数据库中,使用下面给出的脚本创建名为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

在程序包的“连接管理器”部分中,右键单击并选择“从数据源新建连接” 在“ 选择数据源”对话框中,选择“ Adventure Works” ,然后单击“确定” 您现在应该在“ 连接管理器”部分下看到Adventure Works数据源。

在包的“连接管理器”部分,再次右键单击,但这次选择“ 新建连接...” 这是为了创建Excel连接。 在“添加SSIS连接管理器”上,选择“ EXCEL” 在Excel连接管理器上,输入路径C:\\ Temp \\ Template.xls 当我们将它部署到服务器时,我们将更改此路径。 我选择了Excel版本Microsoft Excel 97-2005并选择保留复选框第一行已选中列名,以便创建Excel文件创建列标题。 单击确定 将Excel连接重命名为Excel ,只是为了保持简单。 参考屏幕截图#2 - #7

在包上,创建以下变量。 参见截图#8

  • SQLGetData :此变量的类型为String。 这将包含存储过程执行语句。 此示例使用值EXEC dbo.GetCurrency

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

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

双击“数据流任务”以切换到“数据流”选项卡。

在“数据流”选项卡上,放置OLE DB Source以连接到SQL Server数据以从存储过程中获取数据并将其命名为SQL。 双击OLE DB源以打开OLE DB源编辑器。 在“连接管理器”部分,从OLE DB连接管理器中选择Adventure Works ,从数据访问模式的变量中选择SQL命令,然后从“变量名称”下拉列表中选择变量User :: SQLGetData 在“列”部分,确保正确映射列名称。 单击“确定”关闭OLE DB源编辑器。 参考截图#11#12

在“数据流”选项卡上,放置Excel Destination以将数据插入Excel文件并将其命名为Excel。 双击Excel目标以打开Excel目标编辑器。 在“连接管理器”部分,从OLE DB连接管理器中选择Excel,然后从数据访问模式中选择“表”或“视图”。 此时,我们没有Excel,因为在创建Excel连接管理器时,我们只是指定了路径但从未创建过该文件。 因此,Excel工作表的下拉名称中不会有任何值。 因此,单击“ 新建...”按钮(第二个“ 新建”按钮)以创建新的Excel工作表。 在“创建表”窗口中,BIDS会根据传入的数据源自动提供创建工作表。 您可以根据自己的喜好更改值。 我只需通过保留默认值单击“确定”。 工作表的名称将填充在Excel工作表的下拉名称中。 工作表的名称取自任务名称,在本例中为Excel目标,我们将其命名为Excel。 在“映射”部分,确保正确映射列名称。 单击“确定”关闭“Excel目标编辑器”。 参考截图#13 - #16

配置数据流任务后,它应如截屏#17所示。

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

该软件包在我的本地计算机上在文件夹路径C:\\ Learn \\ Learn.VS2005 \\ Learn.SSIS中开发 现在,我们需要将文件部署到托管64位版本SQL Server的服务器上以安排作业。 因此,服务器上的文件夹将是D:\\ SSIS \\ Practice 从本地计算机复制包文件( .dtsx )并将其粘贴到服务器文件夹中。 此外,为了使包正确运行,我们需要在服务器上提供Excel电子表格。 否则,验证将失败。 通常,我创建一个模板文件夹,其中包含与输出匹配的空Excel电子表格文件。 稍后,在运行期间,我将使用包配置将Excel输出路径更改为其他位置。 对于这个例子,我将保持简单。 因此,让我们将路径C:\\ Temp \\ Template.xls中本地计算机中生成的Excel文件复制到服务器位置D:\\ SSIS \\ Practice 我希望SQL作业以名称Currencies.xls生成文件。 因此,将Template.xls文件重命名为Currencies.xls 参见截图#22

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

我们将使用Execute Package Utility (dtexec.exe)生成命令行参数。 登录将在SQL作业中运行SSIS包的服务器。 双击包文件,这将带来Execute Package Utility。 在“常规”部分,从“包源”中选择“文件系统”。 单击省略号并浏览到包路径。 在“连接管理器”部分,选择“Excel”并将Excel文件中的路径从C:\\ Temp \\ Template.xls更改为D:\\ SSIS \\ Practice \\ Currencies.xls。 在Utility中进行的更改将在“命令行”部分生成相应的命令行。 在“命令行”部分,复制包含所有必需参数的命令行。 我们不打算从这里执行包。 单击关闭 参考屏幕截图#24 - #26

接下来,我们需要设置一个作业来运行SSIS包。 我们无法选择SQL Server Integration Services包类型,因为它将在64位下运行,并且找不到Excel连接提供程序。 因此,我们必须将其作为Operating System (CmdExec)作业类型运行。 转到SQL Server Management Studio并连接到数据库引擎。 展开SQL Server代理,然后右键单击“作业”节点。 选择新工作.... 在“作业属性”窗口的“常规”部分中,将作业名称提供为01_SSIS_Export_To_Excel,所有者将是创建作业的用户。 我有一个名为SSIS的类别,所以我将选择它,但默认类别是[Uncategorized(Local)]并提供简要说明。 在“步骤”部分,单击“ 新建...”按钮。 这将带来Job Step属性。 在“作业步骤”属性的“常规”部分,提供“步骤名称”作为“导出到Excel”,选择“ Operating system (CmdExec)类型” Operating system (CmdExec) ,将默认的“运行方式”帐户保留为SQL Server代理服务帐户,并提供以下命令。 单击确定。 在“新建作业”窗口中,单击“确定”。 参考截图#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代理 - >作业节点下。 右键单击新创建的作业01_SSIS_Export_To_Excel,然后选择步骤中的“开始作业...” ,这将开始作业执行。 该作业将按预期失败,因为这是此问题的背景。 单击“关闭”以关闭“启动作业”对话框 参考屏幕截图#32#33

我们来看看发生了什么。 转到SQL Server代理和作业节点。 右键单击作业01_SSIS_Export_To_Excel,然后选择“查看历史记录”。 这将带来Log File Viewer窗口。 您可以注意到作业失败了。 展开红叉附近的节点,然后单击Step ID值为1的行。在底部,您可以看到错误消息Option “8.0;HDR=YES';” is not valid. 单击“关闭”以关闭“日志文件查看器”窗口 参考屏幕截图#34#35

现在,右键单击作业,然后选择“属性”以打开“作业属性”。 您还可以双击作业以显示“作业属性”窗口。 单击左侧部分的步骤。 然后单击编辑。 使用以下命令替换该命令,然后单击“确定”。 单击“作业属性”上的“确定”关闭窗口。 右键单击作业01_SSIS_Export_To_Excel并选择Step at Step ...,这将开始执行作业。 作业将无法成功执行。 单击“关闭”以关闭“启动作业”对话框 我们来看看历史。 右键单击作业01_SSIS_Export_To_Excel,然后选择“查看历史记录”。 这将带来Log File Viewer窗口。 您可以注意到作业在第二次运行期间成功完成。 展开绿色勾选十字架附近的节点,然后单击步骤ID值为1的行。在底部,您可以看到消息选项步骤成功。 单击“关闭”以关闭“日志文件查看器”窗口 文件D:\\ SSIS \\ Practice \\ Currencies.xls将成功填充数据。 如果多次成功执行作业,数据将附加到文件中,您将找到更多数据。 正如我之前提到的,这不是生成文件的正确方法。 创建此示例是为了演示此问题的修复程序。 参考截图#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:变量

变量

#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

===============>>#2 票数:4

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

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

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

===============>>#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 票数:2

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

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

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


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

===============>>#5 票数: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

  ask by KiwiNige translate from so

未解决问题?本站智能推荐: