sql >> Base de Datos >  >> RDS >> Sqlserver

Actualizar datos a través de una función con valores de tabla en SQL Server

En SQL Server, es posible actualizar los datos a través de una función con valores de tabla.

Lo que quiero decir es que puede actualizar los datos en las tablas subyacentes que consulta la función.

Por ejemplo, si su función devuelve el nombre de alguien de una tabla, puede actualizar su nombre ejecutando UPDATE declaración contra la función en lugar de la tabla.

Tenga en cuenta que esto solo funciona en funciones con valores de tabla en línea (ITVF). Hasta donde yo sé, no funcionará en funciones con valores de tabla de múltiples instrucciones (MSTVF).

Además, las columnas que actualice deberán ser columnas válidas en la consulta de la función.

Ejemplo 1:función de muestra

Aquí hay una función rápida que selecciona datos básicos de una tabla.

CREATE FUNCTION udf_GetScore_ITVF( @Player varchar(255))
    RETURNS TABLE
AS
RETURN (
    SELECT Score
    FROM dbo.Scoreboard
    WHERE Player = @Player
    );
GO

Esta función simplemente selecciona la puntuación de un jugador determinado.

Podría usar esta función para actualizar la puntuación de un jugador.

Me doy cuenta de que normalmente devolvería más de una columna al usar una función con valores de tabla, pero quiero mantener este ejemplo simple para fines de demostración.

Ejemplo 2:actualizar datos a través de la función

Este es un ejemplo de cómo actualizar la puntuación del jugador.

Primero, veamos cuál es el puntaje actual de ese jugador.

SELECT * FROM udf_GetScore_ITVF('Homer');

Resultado:

+---------+
| Score   |
|---------|
| 1       |
+---------+

Entonces Homer tiene una puntuación de 1.

Usemos la función con valores de tabla para aumentarlo.

UPDATE udf_GetScore_ITVF('Homer') SET Score = 99999;

SELECT * FROM udf_GetScore_ITVF('Homer');

Resultado:

+---------+
| Score   |
|---------|
| 99999   |
+---------+

Así que aumenté con éxito la puntuación de Homer usando la función de valores de tabla en línea.

Ejemplo 3:cuando no funciona

Las columnas reales que puede actualizar dependerán de las columnas que se seleccionen en la consulta. Mi consulta solo selecciona la Score columna, por lo que solo puedo actualizar los datos en esa columna.

Esto es lo que sucede si trato de actualizar los datos en otra columna.

UPDATE udf_GetScore_ITVF('Homer') SET Player = 'Apu';

Resultado:

Msg 207, Level 16, State 1, Line 1
Invalid column name 'Player'.

Sabemos que la mesa tiene un Player columna (porque está en WHERE cláusula de la función). Sin embargo, no está seleccionada en la consulta y, por lo tanto, no es una columna válida para actualizar.