Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Atualizar dados por meio de uma função com valor de tabela no SQL Server


No SQL Server, é possível atualizar dados por meio de uma função com valor de tabela.

O que quero dizer é que você pode atualizar dados nas tabelas subjacentes que a função consulta.

Por exemplo, se sua função retornar o primeiro nome de alguém de uma tabela, você pode atualizar o primeiro nome executando um UPDATE declaração contra a função em vez da tabela.

Observe que isso só funciona em funções com valor de tabela embutido (ITVFs). Tanto quanto sei, não funcionará em funções com valor de tabela de várias instruções (MSTVFs).

Além disso, as colunas que você atualizar precisarão ser colunas válidas na consulta da função.


Exemplo 1 – Função de exemplo


Aqui está uma função rápida que seleciona dados básicos de uma tabela.
CREATE FUNCTION udf_GetScore_ITVF( @Player varchar(255))
    RETURNS TABLE
AS
RETURN (
    SELECT Score
    FROM dbo.Scoreboard
    WHERE Player = @Player
    );
GO

Esta função simplesmente seleciona a pontuação para um determinado jogador.

Eu poderia usar esta função para atualizar a pontuação de um jogador.

Percebo que você normalmente retornaria mais de uma coluna ao usar uma função com valor de tabela, mas quero manter este exemplo simples para fins de demonstração.

Exemplo 2 – Atualizar dados por meio da função


Aqui está um exemplo de atualização da pontuação do jogador.

Primeiro, vamos ver qual é a pontuação atual desse jogador.
SELECT * FROM udf_GetScore_ITVF('Homer');

Resultado:
+---------+
| Score   |
|---------|
| 1       |
+---------+

Então Homer tem uma pontuação de 1.

Vamos usar a função com valor de tabela para aumentá-lo.
UPDATE udf_GetScore_ITVF('Homer') SET Score = 99999;

SELECT * FROM udf_GetScore_ITVF('Homer');

Resultado:
+---------+
| Score   |
|---------|
| 99999   |
+---------+

Então eu aumentei com sucesso a pontuação de Homer usando a função com valor de tabela inline.

Exemplo 3 – Quando não funciona


As colunas reais que você pode atualizar dependerão das colunas selecionadas na consulta. Minha consulta seleciona apenas a Score coluna, então só posso atualizar os dados nessa coluna.

Aqui está o que acontece se eu tentar atualizar dados em outra coluna.
UPDATE udf_GetScore_ITVF('Homer') SET Player = 'Apu';

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

Sabemos que a mesa tem um Player coluna (porque está no WHERE cláusula da função). No entanto, ela não está selecionada na consulta e, portanto, não é uma coluna válida para atualização.