SQL Serverでは、テーブル値関数を介してデータを更新することができます。
つまり、関数がクエリする基になるテーブルのデータを更新できます。
たとえば、関数がテーブルから誰かの名を返す場合、UPDATE
を実行してその人の名を更新できます。 テーブルの代わりに関数に対するステートメント。
これは、インラインテーブル値関数(ITVF)でのみ機能することに注意してください。私の知る限り、マルチステートメントのテーブル値関数(MSTVF)では機能しません。
また、更新する列は、関数のクエリで有効な列である必要があります。
例1-サンプル関数
これは、テーブルから基本データを選択するクイック関数です。
CREATE FUNCTION udf_GetScore_ITVF( @Player varchar(255)) RETURNS TABLE AS RETURN ( SELECT Score FROM dbo.Scoreboard WHERE Player = @Player ); GO
この関数は、特定のプレーヤーのスコアを選択するだけです。
この関数を使用して、プレーヤーのスコアを更新できます。
テーブル値関数を使用すると、通常は複数の列が返されることを理解していますが、デモンストレーションのためにこの例を単純にしておきたいと思います。
例2–関数を介してデータを更新する
プレーヤーのスコアを更新する例を次に示します。
まず、そのプレーヤーの現在のスコアを見てみましょう。
SELECT * FROM udf_GetScore_ITVF('Homer');
結果:
+---------+ | Score | |---------| | 1 | +---------+
したがって、ホーマーのスコアは1です。
テーブル値関数を使用してそれを増やしましょう。
UPDATE udf_GetScore_ITVF('Homer') SET Score = 99999; SELECT * FROM udf_GetScore_ITVF('Homer');
結果:
+---------+ | Score | |---------| | 99999 | +---------+
そこで、インラインのテーブル値関数を使用して、ホーマーのスコアを上げることに成功しました。
例3–機能しない場合
更新できる実際の列は、クエリで選択されている列によって異なります。私のクエリはScore
のみを選択します 列なので、その列のデータのみを更新できます。
別の列のデータを更新しようとすると、次のようになります。
UPDATE udf_GetScore_ITVF('Homer') SET Player = 'Apu';
結果:
Msg 207, Level 16, State 1, Line 1 Invalid column name 'Player'.
テーブルにPlayer
があることがわかっています 列(WHERE
にあるため 関数の節)。ただし、クエリで選択されていないため、更新するのに有効な列ではありません。