Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

Cập nhật dữ liệu thông qua một hàm có giá trị bảng trong SQL Server

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.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Nhận AVG bỏ qua giá trị Null hoặc Zero

  2. Khái niệm cơ bản về tự động hóa tác vụ SQL Server

  3. Nén một phân vùng cụ thể trong một bảng trong SQL Server (T-SQL)

  4. vấn đề với AttachDbFilename là gì

  5. Thay thế chức năng trễ dẫn trong SQL Server 2008