This website requires JavaScript.

[译]在 64bit 环境中执行32 bit的SSIS包

最近碰到了一个众所周知的32bit的 SSIS 包在64bit的SQL Server环境的执行问题. 我看了一些解决方案,比如修改在SSDT里面修改 debug 选项(Run64BitRuntime = false) 或者建立一个job执行的时候强制以32bit方式运行. 不过我发现这些方式并不合适大型的自动化环境. 你可能在测试SSIS包的候会用这些方法 ,但是你部署到SSIS服务器的时候不一定想要这么做. 我想还有一个方法就是建立一个job, 强制包为32bit执行模式.然后建立一个脚本更改job step 来执行特定的SSIS包. 不过在我看来太麻烦,而且不够完美.

我最近还见到一个解决方案,有个客户的数据仓库管理员被要求修改一个环境变量来强制所有的SSIS包执行在32bit模式下 (官方的管理指导手册有说明)

我试过这个方法,根本没用(相信我..我已经尝试所有办法啦,没搞定) .另外你只有一个或者小部分 32bit的包,为什么要把所有的64bit包强制运行在32bit模式下. 这会影响性能.

好了,接下来说说我的处理方法.不过,对我的方法可不要深信不疑了. 看到我这篇文章的朋友们,如果有更好的更方便的方法请告诉我.

如果你用我的方案的过程中碰到任何问题请告诉我. 我们一起处理.

问题: 在64Bit的SQL server使用32Bit的包.

解决方案: 用存储过程执行SSIS包 (32 & 64 bit).

create procedure [dbo].[Execute32and64BitSSIS] @PackageName varchar(255) as begin

set nocount on;

declare @ErrorMessage int, @PackageLocation varchar(1000), @CheckSubsystem varchar(1000), @CheckIf64BitCmd varchar(1000), @cmd varchar(1000)

select @CheckSubsystem = agent_exe from msdb.dbo.syssubsystems where subsystem = 'ssis' --print @CheckSubsystem

set @ErrorMessage = 0; set @PackageLocation = '/sq ' + @PackageName +' /ser ' + @@servername set @CheckIf64BitCmd = '"'+@CheckSubsystem + '" ' + @PackageLocation + ' /VALIDATE'

exec @ErrorMessage = xp_cmdshell @CheckIf64BitCmd, no_output --print @ErrorMessage

if (@ErrorMessage = 0) -- if 0 (no error) then it is 64bit setting set @cmd = '"'+@CheckSubsystem + '" ' + @PackageLocation else -- an errors occured when attempting to validate package in 64bit mode(meaning it's 32 bit setting) set @cmd = '"'+replace(@CheckSubsystem,'\Program Files', '\Program Files (x86)') + '" ' + @PackageLocation

--print @cmd
exec xp_cmdshell @cmd, no_output

end

看起来还不错吧?

**快速说明: **

在更进一步之前,我们先来看下 syssubsystems 里面有什么.

select agent_exe, * from msdb.dbo.syssubsystems where subsystem = 'ssis'
Step 1: 这个存储的参数是@PackageName  , 可以传入服务器里面一个SSIS包名  – line 2

Step 2: 获得 DTExec.exe 的位置 (select * from msdb.dbo.syssubsystems where subsystem = ‘ssis’) – line 16

Step 3: 设置 SSIS 包位置 – line 24

Step 4: 检查SSIS是否是64bit – line 25.

Step 5: 验证包.  – line 27

Step 6: 如果 error message = 0 那么就是 64 bit 包,@cmd 进行64bit的设置 – line 31

Step 7: 如果 error message = 1 那么就是 32 bit 包,@cmd 进行32bit的设置 – line 33

我意识到,可能有其他情况也会导致报错. 这样的话无论包是64bit还是32bit 都会按照32bit 执行 . 不过这个没关系,反正32bit也一样执行.

Step 8: 使用 xp_cmdshell 执行包.

在一些系统执行 powershell (xp_cmdshell) 可能有些问题.我不知道你能不能用. 如果不行可以把之前的存储插入到下面代码中.

下面代码作用是执行存储时候临时开启xp_cmdshell,结束后关闭 :

 declare @IsXpCmdshellEnabled bit

select @IsXpCmdshellEnabled = cast(value_in_use as bit) from sys.configurations where name = 'xp_cmdshell'

if @IsXpCmdshellEnabled = 0 begin exec sp_configure 'show advanced',1 reconfigure with override exec sp_configure 'xp_cmdshell', 1 reconfigure with override exec sp_configure 'show advanced',0 end


--insert my SP here

if @IsXpCmdshellEnabled = 0 begin exec sp_configure 'show advanced',1 reconfigure with override exec sp_configure 'xp_cmdshell', 0 reconfigure with override exec sp_configure 'show advanced',0 end

 

原文: http://www.sqlservercentral.com/articles/Integration+Services+(SSIS)/102544/

0条评论
avatar