sql >> データベース >  >> RDS >> Sqlserver

SQLServerのテーブル値関数を介してデータを更新する

    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にあるため 関数の節)。ただし、クエリで選択されていないため、更新するのに有効な列ではありません。


    1. SUBDATE()の例– MySQL

    2. C#の単一のOracleコマンドで複数のクエリを実行する

    3. postgresで最大接続数を増やす方法は?

    4. SQL:NULL値のみの列を選択します