В 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
клауза на функцията). Той обаче не е избран в заявката и следователно не е валидна колона за актуализиране.