Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Aktualizuj dane za pomocą funkcji o wartościach przechowywanych w tabeli w SQL Server

W SQL Server możliwa jest aktualizacja danych za pomocą funkcji z wartościami tabelarycznymi.

Mam na myśli to, że możesz aktualizować dane w bazowych tabelach, do których wysyła zapytanie.

Na przykład, jeśli twoja funkcja zwraca czyjeś imię z tabeli, możesz zaktualizować jego imię, uruchamiając UPDATE oświadczenie przeciwko funkcji zamiast tabeli.

Należy zauważyć, że działa to tylko w przypadku wbudowanych funkcji z wartościami przechowywanymi w tabeli (ITVF). O ile mi wiadomo, nie będzie działać na wieloinstrukcyjnych funkcjach z wartościami tabelarycznymi (MSTVF).

Ponadto aktualizowane kolumny muszą być prawidłowymi kolumnami w zapytaniu funkcji.

Przykład 1 – Przykładowa funkcja

Oto szybka funkcja, która wybiera podstawowe dane z tabeli.

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

Ta funkcja po prostu wybiera wynik dla danego gracza.

Mógłbym użyć tej funkcji, aby zaktualizować wynik gracza.

Zdaję sobie sprawę, że zwykle zwracasz więcej niż jedną kolumnę, gdy używasz funkcji o wartościach z tabeli, ale chcę, aby ten przykład był prosty w celach demonstracyjnych.

Przykład 2 – Aktualizacja danych za pomocą funkcji

Oto przykład aktualizacji wyniku gracza.

Najpierw zobaczmy, jaki jest obecny wynik tego gracza.

SELECT * FROM udf_GetScore_ITVF('Homer');

Wynik:

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

Więc Homer ma wynik 1.

Użyjmy funkcji wartości tabeli, aby ją zwiększyć.

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

SELECT * FROM udf_GetScore_ITVF('Homer');

Wynik:

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

Więc udało mi się zwiększyć wynik Homera za pomocą wbudowanej funkcji z wartościami w tabeli.

Przykład 3 – kiedy to nie zadziała

Rzeczywiste kolumny, które możesz zaktualizować, będą zależeć od kolumn wybranych w zapytaniu. Moje zapytanie wybiera tylko Score kolumna, więc mogę aktualizować tylko dane w tej kolumnie.

Oto, co się stanie, jeśli spróbuję zaktualizować dane w innej kolumnie.

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

Wynik:

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

Wiemy, że stół ma Player kolumna (ponieważ jest w WHERE klauzula funkcji). Nie jest ona jednak zaznaczona w zapytaniu i dlatego nie jest prawidłową kolumną do zaktualizowania.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak tworzyć zadania w edycji SQL Server Express

  2. Jak używać GROUP BY do łączenia ciągów w SQL Server?

  3. Scal dwie partycje w jedną w programie SQL Server (T-SQL)

  4. SQL Query wolno w aplikacji .NET, ale natychmiastowo w SQL Server Management Studio

  5. Przechowywanie danych UTF-16/Unicode w SQL Server