私はストアドプロシージャを持っています。これをストアドプロシージャ '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出力のみを実行しますか?おそらくセキュリティ/権利の問題だと思ったのですか?この問題を回避する方法は他にありますか?
ありがとうございました!