1

1つのデータフロータスク(OLE DBソースからフラットファイルへ)を含む非常に基本的なSSISパッケージがあります。

制御フロー

データフロー

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ブロックの先頭で開始されたトランザクションに実際に参加しますか?そうでない場合は参加できますか?

4

1 に答える 1

0

xp_cmdshellのアクションはトランザクションの外部にあり、SSISであるか別のクエリであるかは関係ありません。@ssisstringを'sqlcmd-S myserver -d mydatabase -Q "SELECT TOP 1FROMdbo.TestTable"に簡単に置き換えることができます。

トランザクションが必要な場合は、SSISで実行してください。DELETEステートメントをSQL実行タスクとして配置します。それをデータフロータスクに結び付けます。パッケージレベルで(制御フローの背景を右クリックしてプロパティを選択)、パッケージのトランザクションレベルをSupportedからRequiredに変更します。これにより、トランザクションが開始されます。デフォルトのトランザクションレベルをSupportedからNotSupportedに変更してトランザクションを明示的にオプトアウトしない限り、その中に含まれるすべてのものが親トランザクションに参加します。

于 2011-10-20T14:59:52.680 に答える