1

我有一个非常基本的 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

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

4

1 回答 1

0

xp_cmdshell 中的操作将在事务之外,不管它是 SSIS 还是其他查询。您可以轻松地将@ssisstring 替换为 'sqlcmd -S myserver -d mydatabase -Q "SELECT TOP 1 FROM dbo.TestTable"

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

于 2011-10-20T14:59:52.680 回答