Trong SQL Server, có thể cập nhật dữ liệu thông qua một hàm có giá trị bảng.
Ý tôi là, bạn có thể cập nhật dữ liệu trong các bảng bên dưới mà hàm truy vấn.
Ví dụ:nếu hàm của bạn trả về tên của ai đó từ bảng, bạn có thể cập nhật tên của họ bằng cách chạy UPDATE
câu lệnh chống lại hàm thay vì bảng.
Lưu ý rằng điều này chỉ hoạt động trên các hàm có giá trị bảng nội tuyến (ITVF). Theo như tôi được biết, nó sẽ không hoạt động trên các hàm có giá trị bảng nhiều câu lệnh (MSTVF).
Ngoài ra, các cột bạn cập nhật sẽ cần phải là các cột hợp lệ trong truy vấn của hàm.
Ví dụ 1 - Hàm mẫu
Đây là một chức năng nhanh chọn dữ liệu cơ bản từ một bảng.
CREATE FUNCTION udf_GetScore_ITVF( @Player varchar(255)) RETURNS TABLE AS RETURN ( SELECT Score FROM dbo.Scoreboard WHERE Player = @Player ); GO
Chức năng này chỉ cần chọn điểm cho một người chơi nhất định.
Tôi có thể sử dụng chức năng này để cập nhật điểm của người chơi.
Tôi nhận thấy rằng bạn thường trả về nhiều hơn một cột khi sử dụng hàm định giá trị bảng, nhưng tôi muốn giữ cho ví dụ này đơn giản cho mục đích trình diễn.
Ví dụ 2 - Cập nhật Dữ liệu qua Hàm
Dưới đây là một ví dụ về việc cập nhật điểm số của người chơi.
Trước tiên, hãy xem điểm hiện tại của người chơi đó là bao nhiêu.
SELECT * FROM udf_GetScore_ITVF('Homer');
Kết quả:
+---------+ | Score | |---------| | 1 | +---------+
Vì vậy, Homer có số điểm là 1.
Hãy sử dụng hàm giá trị bảng để tăng nó.
UPDATE udf_GetScore_ITVF('Homer') SET Score = 99999; SELECT * FROM udf_GetScore_ITVF('Homer');
Kết quả:
+---------+ | Score | |---------| | 99999 | +---------+
Vì vậy, tôi đã tăng thành công điểm số của Homer bằng cách sử dụng hàm giá trị bảng nội tuyến.
Ví dụ 3 - Khi nó không hoạt động
Các cột thực tế bạn có thể cập nhật sẽ phụ thuộc vào các cột được chọn trong truy vấn. Truy vấn của tôi chỉ chọn Score
nên tôi chỉ có thể cập nhật dữ liệu trong cột đó.
Đây là những gì sẽ xảy ra nếu tôi cố gắng cập nhật dữ liệu trong một cột khác.
UPDATE udf_GetScore_ITVF('Homer') SET Player = 'Apu';
Kết quả:
Msg 207, Level 16, State 1, Line 1 Invalid column name 'Player'.
Chúng tôi biết rằng bảng có một Player
(vì nó nằm trong WHERE
mệnh đề của hàm). Tuy nhiên, nó không được chọn trong truy vấn và do đó, nó không phải là cột hợp lệ để cập nhật.