3

N 行を返すストアド プロシージャを呼び出し、処理の一環として結果を一時テーブルに挿入する必要がある関数に取り組んでいます。

ストアド プロシージャで EXEC を呼び出すと問題なく動作します: http://sqlfiddle.com/#!3/ed11a/16

では、EXEC の結果をテーブル変数に挿入するとエラーが発生するのはなぜですか: http://sqlfiddle.com/#!3/ed11a/18

私が得ているエラーは次のとおりです。Invalid use of side-effecting or time-dependent operator in 'INSERT EXEC' within a function.

このエラーは通常、関数に対してローカルではない値を操作しようとしたときに生成されることを理解していますが、挿入はテーブル変数に対して行われるため、これは問題になりません。

4

1 に答える 1

3

テーブル変数に挿入するだけですが、呼び出しているストアドプロシージャに副作用がないという保証はありません。関数から呼び出されたストアドプロシージャが任意のデータを挿入/更新/削除したり、スキーマを変更したりするのを防ぐ方法はありません。おそらく、ストアドプロシージャの呼び出しではなく、テーブル値関数を使用して実行しようとしていることを実現できます。

Alter function dbo.MyTable() 
RETURNS  @table TABLE 
(
    -- columns returned by the function
    Col1 int null, 
    Col2 int null, 
    Col3 int null,
    Col4 int null,
    Col5 int null, 
    Col6 int null

)
as
Begin
INSERT INTO @table Values( null, null, 5, null, 63, null)

return 
End
于 2012-07-17T15:49:09.060 に答える