我有一个非常基本的SSIS包,其中包含一个数据流任务(从OLE DB源到平面文件)。
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块顶部开始的事务中,如果没有,可以吗?
答案 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来明确选择退出事务,否则其中包含的所有内容都将登记在父事务中。