2011-10-20 4 views
1

私は、(OLE DBソースからフラットファイルへ)1つのデータフロータスクを持つ非常に基本的なSSISパッケージを持っています。xp_cmdshellを使用して呼び出されたSSISパッケージをSQL Serverトランザクションに参加させることはできますか?

Control Flow

Data Flow

TransactionOptionプロパティは必須に設定されていると私はReadCommittedに、READUNCOMMITTEDおよび直列化に設定したIsolationLevelオプションを試してみました。

パッケージは、テーブル[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

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

トランザクションが必要な場合は、SSISで行います。 DELETEステートメントをSQL実行タスクとして配置します。あなたのデータフロータスクまでのワイヤ。パッケージレベルで(コントロールフローの背景を右クリックしてプロパティを選択)、パッケージのトランザクションレベルを[サポート対象]から[必須]に変更します。これでトランザクションが開始されます。デフォルトのトランザクションレベルを[サポート対象]から[サポート対象外]に変更して、トランザクションを明示的にオプトアウトしない限り、その中に含まれるすべてのものが親トランザクションに追加されます。

+0

OKです。 DELETEがパッケージ外にある理由は、これがテスト実行の一部であり、DELETEが既存のデータをすべて消去するためです。現実にはそうしないでしょうし、既存のデータに遭遇した場合、SSISパッケージは失敗します。 SSISパッケージがトランザクションで登録して、TransactionScopeの.NETアプリケーションから呼び出すのを確実にしたいのであれば、私のオプションは何ですか?SQL Agentジョブから開始しますか? –

関連する問題