0

私はストアドプロシージャを持っています。これをストアドプロシージャ 'B'と呼んでいます。ストアドプロシージャ 'B'は、ストアドプロシージャ 'B'内の一時テーブルに挿入する必要がある結果セットを返すストアドプロシージャ 'A'を呼び出して、さらに突然変異を行います。ネストされた挿入のため、私はOPENROWSETを使用しました(そしてOPENQUERYも試しました)。動的SQL文のEXECプロシージャは、INSERTではなくSELECTのみを行います。

今、うまくいくようです!ただし、結果セットを返す次に、ストアドプロシージャ 'A'はテーブルのINSERTも行います。変なことは、ストアドプロシージャ 'A'がストアドプロシージャ 'B'内から実行されるとき、ストアドプロシージャ 'A'は結果セットのみを返し、全く挿入しないことです。それはちょうどINSERT INTOステートメント全体をスキップするようです。私はINSERTの前と後にダミーのSELECT 'test'ブレークポイントを置こうとしましたが、それらは正常に実行されます!これはどのように可能ですか?

このクエリは次のようになります(私はビットまでのデータと列を変更):

DECLARE @SQL NVARCHAR(MAX) 

SET @SQL = 'INSERT INTO #Temp (1,2,3) 

SELECT * FROM OPENROWSET (
''SQLOLEDB'', 
''Server=(local);TRUSTED_CONNECTION=yes;'', 
''SET FMTONLY OFF EXECUTE StoredProcedureA 

@Parameter1 = '''''[email protected]+''''' 
,@Parameter_2 = '''''[email protected]+''''' 
'' 
)' 

EXEC(@SQL) 

エラーが返されません。結果セット(SELECT statement from procedure A)は手順Bの中で#Tempに正しくロードされますが、手順Aで実行されたINSERTは実行されません。

openquery/openrowsetはINSERTを許可せず、SELECT出力のみを実行しますか?おそらくセキュリティ/権利の問題だと思ったのですか?この問題を回避する方法は他にありますか?

ありがとうございました!

答えて

0

これは、#で示される一時テーブルを使用しているためです。 このテーブルのスコープは、ネストされたストアドプロシージャが終了し、一時テーブルが削除されたときに終了します。

挿入が行われるので、テーブルはもう存在しません。

ネストしたプロシージャを開始する前にテーブルを作成すると、この問題を解決できます。プロシージャBを削除することができます。

関連する問題