使用xp_cmdshell调用的SSIS包可以在SQL Server事务中登记吗?

时间:2011-10-20 14:14:37

标签: sql-server transactions ssis xp-cmdshell

我有一个非常基本的SSIS包,其中包含一个数据流任务(从OLE DB源到平面文件)。

Control Flow

Data Flow

TransactionOption属性设置为Required,我已尝试将IsolationLevel选项设置为ReadCommitted,ReadUncommitted和Serializable。

包将表[TestTable]中的所有行导出到平面文件。

我有以下SQL脚本(我目前在Management Studio中运行):

BEGIN TRANSACTION

DELETE FROM [dbo].[TestTable]

DECLARE @SsisString VARCHAR(8000)
DECLARE @PackageName VARCHAR(200)
DECLARE @ServerName VARCHAR(100)
DECLARE @ReturnCode INT

SET @PackageName = 'TransactionalTestPackage'
SET @ServerName = 'SERVERNAME'
SET @SsisString = 'dtexec /sq ' + @PackageName + ' /ser ' + @ServerName + ' '

EXEC @ReturnCode = xp_cmdshell @SsisString

SELECT @ReturnCode

--COMMIT TRANSACTION
ROLLBACK TRANSACTION

请注意,我在运行包之前删除了表中的所有行,所以理论上该包应该将零行导出到文件中,但实际发生的是包挂起(我认为是因为未提交在TestTable上删除)。问题是:以这种方式调用的SSIS包是否实际登记在SQL块顶部开始的事务中,如果没有,可以吗?

1 个答案:

答案 0 :(得分:0)

xp_cmdshell中的操作将在事务之外,无论是SSIS还是其他查询都无关紧要。您可以使用'sqlcmd -S myserver -d mydatabase -Q“SELECT TOP 1 FROM dbo.TestTable”轻松替换@ssisstring“

如果您需要交易,请在SSIS中进行。将DELETE语句作为执行SQL任务。连接到您的数据流任务。在包级别(右键单击控制流的背景并选择属性),将包的事务级别从Supported更改为Required。这将启动一个交易。除非您通过将默认事务级别从Supported更改为NotSupported来明确选择退出事务,否则其中包含的所有内容都将登记在父事务中。