SELECTステートメント内でユーザー定義関数を使用すると、いくつかの興味深い動作が発生します。
単一のテーブルからデータを読み取ってパージするストアドプロシージャがいくつかあります。これらのストアドプロシージャは、複数のソースで使用されています。
私の観察では、ユーザー定義関数は、それが使用されているSELECTステートメントの実行直後または実行中に常に評価されるとは限らず、任意に評価されることがあるようです。
たとえば、ストアドプロシージャでは、selectステートメントは次のようになります。
SELECT Something, MyFunction(Something) FROM Somewhere;
これに続いて、テーブルからデータをパージする別のストアドプロシージャが呼び出されます。パージされるデータの量は、読み取られた最大IDを格納する別のテーブルによって管理されます。これは、実行中のストアドプロシージャの別のインスタンスによってまだ読み取られていないデータがパージによって削除されないようにするためです。
私のテストコードでは、MyFunctionはテーブルSomewhereの行数を返すだけです。したがって、SELECTステートメントが返す行数と常に同じである必要があると思います。ただし、このストアドプロシージャの2つのインスタンスを実行すると、次のような結果が得られます。
最初のクエリインスタンス:
Something MyFunction(Something)
--------- ---------------------
A 3
B 3
C 3
2番目のクエリインスタンス:
Something MyFunction(Something)
--------- ---------------------
A 0
B 0
C 0
2番目のクエリがすべての行を返すのに、同じテーブルを操作するユーザー定義関数が、テーブルにこれ以上行がないことを報告するのはなぜですか?
とにかく、2番目のクエリインスタンスが一貫していることを確認できますか?ユーザー定義関数は、親ストアドプロシージャが表示しているのと同じデータを引き続き表示しますか?