2017-07-27 5 views
1

私は、リンクサーバーからデータを引き出す必要があるストアドプロシージャを呼び出すマルチスレッドスケジューラプロセス(.NET)ローカルテーブル。私は明示的にトランザクションを使用していません - 私は再実行できるので、プロセスが失敗したことには関心がありません。さらに、分散トランザクション(MSDTC)の複雑化を避けたい。私はSQL Server Management Studioのからストアドプロシージャを実行リンクされたサーバーに関連するクエリは、トランザクションが使用されていないときに分散トランザクションエラーを発生させます。

The operation could not be performed because OLE DB provider "SQLNCLI11" for linked server "XXXX" was unable to begin a distributed transaction. 
OLE DB provider "SQLNCLI11" for linked server "XXXX" returned message "No transaction is active. 

は、それがない:

私は何に実行していることは、.NETプロセスを通してほとんどの時間は、私は次のエラーを取得していますということですエラーは発生しません。私はSSMSの実行が.NETとどのように違うのかを追跡しようとしていましたが、.NETプロセスがエラーを受け取らないインスタンスがいくつか見つかりました。しかしそれでも、失敗したときと失敗したときとを区別することはできません。

@@trancountを記録する手順にいくつかのログを記録しました。これは常に2として登録しています。ログを保存するためにINSERTステートメントをカバーする1つの暗黙のトランザクションを理解できますが、 。それが価値のあるものであれば、私のストアドプロシージャは実際にリンクされたサーバーにアクセスする第2のプロシージャを呼び出します。つまり、@@trancountは成功した場合でも2を返します(SSMSまたは.NETから呼び出された場合でも関係なく)。

DBAは、リンクされたサーバーのプロパティを変更して、「分散トランザクションのプロモートを有効にする」が偽であることを確認しました。もう何を試してみるべきですか?ありがとう!

+0

IIRCの場合、これはLinkedServerの定義に問題があるか、ローカルまたはリモートのSQL Server上にMSDTCがセットアップされているために発生します。私はこれをhhtp://dba.stackexchange.comに持ち込むことをお勧めします。ここには詳細を知っているかもしれないDBAがいます。 – RBarryYoung

+0

また、この質問には多くの有益な情報があります。https://stackoverflow.com/questions/7473508/unable-to-begin-a-distributed-transaction – RBarryYoung

+0

そしてここには:https://stackoverflow.com/questions/18657768/OLE-db-provider-sqlncli-for-linked-to-begin-a-distributed-tr- – RBarryYoung

答えて

1

私はトランザクションの試行を最初に引き起こしていたことを発見しました(トランザクションは不要なので、私の目標です)。リンクされたサーバーからデータを取得する手順では、SELECT ... INTO #tempパターンを使用して#tempテーブルにそのデータを挿入していました。そこから選択していたテーブルは、リンク先のサーバーを経由していたので、そこにも一時テーブルを作成していたと思います。どちらか、それともローカルにtempテーブルを作成していたのですが、選択したテーブルがリンクされたサーバーの向こう側にあったため、ローカルサーバーとリンクサーバーの両方にトランザクションを拡張しようとしていました。

どちらの方法でも、INSERT ... SELECTステートメントの前に別のステートメントで一時テーブルを作成するように変更したとき、エラーなく機能しました。

これは私には分かりませんが、この手順は(毎回SSMS経由で、まれに.NET経由で)動作する理由です。どういうわけか私は別の実行計画までチョークするつもりです...そしてSQL Serverのブードゥー・マジック。

関連する問題