Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Актуализирайте данните чрез функция с таблично значение в SQL Server

В 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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SQL Server 2005 Пивот върху неизвестен брой колони

  2. Събития на изчакване на SQL сървър -3

  3. Как да използвате клаузата Where в Select Statement в SQL Server - SQL Server / TSQL Урок, част 109

  4. Използване на sp_help_schedule в SQL Server

  5. Какво се случва с идентификатора на първичния ключ, когато надхвърли лимита?