我有一个我在VS2012中开发的软件包(使用SQL Data Tools组件),它使用VFPOLEDB提供程序从DBF文件收集数据,并将其放入SQL Server 2012 X64服务器上的数据库中。包含该程序包的项目将Run64BitRuntime的DebugOption设置为false。我已将此包导入测试和实时服务器的SSIS包存储(相同的设置)。 VFPOLEDB提供程序安装在两者上,我可以在两台计算机的注册表中看到它的32位运行时。
程序包在测试计算机上运行良好,但在活动计算机上运行失败。 SQL的实时实例似乎无法识别已安装的32位VFPOLEDB提供程序。
SQL实例的唯一区别是实时环境设置了集成服务目录,而测试则没有。查看服务器的日志,当实时启动时,它会运行sp_ssis_startup,然后记录有关正在加载的不安全程序集的消息。由于没有目录,此SP不会在测试环境中运行。
我创建的作业将标志设置为使用32位运行时,但我无法帮助,但我觉得SSIS目录与我正在使用的VFPOLEDB有问题,而不是加载它。
我对SSIS目录一无所知,那么是否有人能够建议我可以进入的任何方向?
更新: 这是我的工作步骤配置。设置32位运行时标志。
更新#2:
更新#3:
我刚检查过,测试和现场环境与我原先说的不一样。实时服务器没有32位版本的dtexec.exe(虽然我认为这不重要,因为TechNet表示使用SQL Server代理运行的作业将始终使用64位版本。我想我用过用于设置测试环境的x86和i64 ISO,但是只有64位版本才能实现。改变这一点需要,我想象一下,从活动框中卸载Integration Services共享组件并使用双iso重新安装它。
我想设置"使用32位运行时"选项仅在有32位版本可用时才有效?这可能解释了一些事情。
答案 0 :(得分:11)
默认情况下,服务器上的所有内容都将以64位运行。要更改此行为,您需要指明应使用32位版本的dtexec。对于2012 SSISDB,我们有两种简单的方法来调用我们的包:SQL Agent和catalog.start_execution
方法。
对于单个服务包运行,您可以在SSISDB目录中找到该包,然后右键单击它们到Execute...
在弹出的对话框中,您需要转到“高级”选项卡并选中32-bit runtime
框。这将在包的每次运行中完成。
在幕后,向导生成的SQL看起来像
DECLARE @execution_id bigint
EXEC [SSISDB].[catalog].[create_execution]
@package_name = N'Package.dtsx'
, @execution_id = @execution_id OUTPUT
, @folder_name = N'POC'
, @project_name = N'SSISConfigMixAndMatch'
, @use32bitruntime = True
, @reference_id = NULL
SELECT
@execution_id
DECLARE @var0 smallint = 1
EXEC [SSISDB].[catalog].[set_execution_parameter_value]
@execution_id
, @object_type = 50
, @parameter_name = N'LOGGING_LEVEL'
, @parameter_value = @var0
EXEC [SSISDB].[catalog].[start_execution]
@execution_id
GO
如您所见,@use32bitruntime
参数的值为True,表示它应该在32个空格中运行。
对于重复的包运行,我们通常使用调度工具。要在代理程序中获取程序包的32位设置,它基本上是相同的单击路径,除非您首先需要单击“配置”选项卡,然后然后单击“高级”选项卡以选择{{ 1}}
作业步骤定义类似于
32-bit runtime
您将在@command调用中看到,向导会生成EXEC msdb.dbo.sp_add_jobstep
@job_name = N'Do it'
, @step_name = N'Run in 32bit'
, @step_id = 1
, @cmdexec_success_code = 0
, @on_success_action = 1
, @on_fail_action = 2
, @retry_attempts = 0
, @retry_interval = 0
, @os_run_priority = 0
, @subsystem = N'SSIS'
, @command = N'/ISSERVER "\"\SSISDB\POC\SSISConfigMixAndMatch\Package.dtsx\"" /SERVER "\".\dev2014\"" /X86 /Par "\"$ServerOption::LOGGING_LEVEL(Int16)\"";1 /Par "\"$ServerOption::SYNCHRONIZED(Boolean)\"";True /CALLERINFO SQLAGENT /REPORTING E'
, @database_name = N'master'
, @flags = 0
调用,这是为SQL Agent保留的特殊参数(在开头检查BOL链接)以指示32或应使用64位版本的dtexec。命令行调用将要求我们明确使用正确的dtexec。默认情况下,64位dtexec将首先列在PATH环境中
它在一台服务器上运行,而不在另一台服务器上运行。
第1步 - 验证您是否已安装驱动程序。愚蠢,显而易见,但有很多问题,人们错误地认为部署SSIS包/ .ispac也会部署所有引用的程序集。它不是nuget所以不,所有先决条件都需要安装和正确安装(看到人们试图将程序集复制到GAC而不是使用工具)
步骤2 - 验证驱动程序安装是否与服务器匹配。再次,似乎很明显,但我经历过痛苦,一般是VS_NEEDSNEWMETADATA,在驱动程序版本4.0.2.013上的点差异产生的结果与4.0.2.014不同
步骤3 - 确保您定义的所有DSN都在正确的空间中定义。由于种种原因,这个人咬人。我认为直到Server 2012你才能获得32位版本的odbcad32.exe(与管理工具相关的可执行文件 - >数据源(ODBC))是通过在文件系统上找到它。令人困惑的是,可执行文件名为odbcad32.exe,无论它是在System32还是SysWOW64中,这两个文件夹分别用于64位驱动程序和32位驱动程序。是的,未来的读者,这不是一个错字。 64版本的应用程序在System32中,32位版本在SysWOW64中。这是一项旨在尽量减少影响的设计决策。
在测试和实时服务器上,运行/X86
找到您的FoxPro驱动程序和相关的DSN,它们是否符合预期?
第4步 - 奇怪的权限检查。以" normal"身份登录到两台服务器帐户并从命令行运行包。重复此步骤,但使用代理执行它,使用您可能已定义或未定义的任何代理。如果第一个工作但后者失败,则通常表示权限问题。可能是SQL Server或代理帐户无法访问驱动程序安装到的任何文件夹。可能是所述帐户需要InteractWithDesktop权限或其他被拒绝或未明确授予的权限。
答案 1 :(得分:0)
如果要以32位模式从64位SQL Server代理作业运行包,请选择作业步骤类型o - >操作系统,然后输入命令行或使用调用的批处理文件32位版本的dtexec.exe
命令:CD" C:\ Program Files(x86)\ Microsoft SQL Server \ 120 \ DTS \ Binn \" DTExec.exe / f" C:\ Download \ Root \ SQL Package.dtsx"
或命令: " C:\ Program Files(x86)\ Microsoft SQL Server \ 120 \ DTS \ Binn \ DTExec.exe" /文件 " C:\ Download \ Root \ SQL Package.dtsx" / MAXCONCURRENT" -1 " /检查点/报告V / CONSOLELOG NCOSGXMT
注意:我使用的是SQL 2014 64位版本。