Kiw*_*ige 7 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
Run Code Online (Sandbox Code Playgroud)
这给了我错误: Option "Properties=Excel 8.0;HDR=Yes" is not valid.
我已尝试过一些带引号的变体,但尚未能正确使用它.
有谁知道如何解决这一问题?
UPDATE:
感谢您的帮助,但我现在决定使用CSV文件,因为它们似乎只适用于64位版本.
小智 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
Run Code Online (Sandbox Code Playgroud)
在程序包的"连接管理器"部分中,右键单击并选择"从数据源新建连接".在" 选择数据源"对话框中,选择" Adventure Works",然后单击"确定" 您现在应该在" 连接管理器"部分下看到Adventure Works数据源.
在包的"连接管理器"部分,再次右键单击,但这次选择" 新建连接...".这是为了创建Excel连接.在"添加SSIS连接管理器"上,选择" EXCEL".在Excel连接管理器上,输入路径C:\ Temp\Template.xls.当我们将它部署到服务器时,我们将更改此路径.我选择了Excel版本Microsoft Excel 97-2005并选择保留复选框第一行已选中列名,以便创建Excel文件创建列标题.单击确定.将Excel连接重命名为Excel,只是为了保持简单.参考屏幕截图#2 - #7.
在包上,创建以下变量.参见截图#8.
屏幕截图#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)
,保留默认的"作为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
Run Code Online (Sandbox Code Playgroud)
新作业应显示在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
#2: New_Connection_Data_Source
#3: Select_Data_Source
#4: New_Connection
#5: Add_SSIS_Connection_Manager
#6: Excel_Connection_Manager
#7: Connection_Managers
#8:变量
#9: Stored_Procedure_Output
#10: Control_Flow
#11: OLE_DB_Source_Connections_Manager
#12: OLE_DB_Source_Columns
#13: Excel_Destination_Editor_New
#14: Excel_Destination_Create_Table
#15: Excel_Destination_Edito
#16: Excel_Destination_Mappings
#17: Data_Flow
#18: Successful_Package_Execution_Control
#19: Successful_Package_Execution_Data_Flow
#20: C_Temp_File_Created
#21: Data_Populated
#22: File_On_Server
#23: SQL_Server_Version
#24: Execute_Package_Utility_General
#25: Execute_Package_Utility_Connection_Managers
#26: Execute_Package_Utility_Command_Line
#27: Job_New_Job
#28: New_Job_General
#29: New_Job_Step
#30: New_Job_Step_General
#31: New_Job_Steps_Added
#32: Job_Start_Job_at_Step
#33: SQL_Job_Execution_Failure
#34: View_History
#35: SQL_Job_Error_Message
#36: SQL_Job_Execution_Success
#37: SQL_Job_Success_Message
#38: Excel_File_Generated
#39: Command_Comparison
除非是业务需求,否则我建议您将连接字符串从命令行移至包,并使用包配置来定义 Excel 文件的路径(以免对其进行硬编码)。这将使它更容易维护。
"Data Source=" + @[User::FilePath] + ";Provider=Microsoft.Jet.OLEDB.4.0;Extended Properties=dBASE IV;"
仔细看看上面的连接字符串。它取自工作包。我对此不确定,但也许您根本不需要任何引号(上面的引号只是因为表达式编辑器需要它们)。
我在 64 位 SQL Server 2005 上的 SSIS 也遇到了一些问题。我博客中的那篇文章没有回答您的问题,但它有些相关,所以我发布了链接。
归档时间: |
|
查看次数: |
23347 次 |
最近记录: |