Một hạn chế được biết đến rộng rãi của các cột được tính toán trong SQL Server là chúng không thể truy cập dữ liệu từ các bảng khác. Nghĩa là, biểu thức của bạn có thể sử dụng các cột trong cùng một bảng, nhưng không sử dụng từ các bảng khác.
Nhưng điều này chỉ đúng một nửa. Mặc dù bạn không thể tham chiếu trực tiếp đến cột của bảng khác trong biểu thức của mình, nhưng bạn có thể gọi một chức năng do người dùng xác định. Và do đó, bạn có thể tạo một hàm do người dùng xác định để thực hiện phép tính bạn cần, sau đó chỉ cần gọi hàm đó dưới dạng biểu thức của cột được tính toán của bạn.
Đây là một ví dụ để chứng minh.
Bảng mẫu
Tôi có một cơ sở dữ liệu với các bảng sau:
SELECT TOP(5) * FROM Artists; +------------+------------------+--------------+-------------+ | ArtistId | ArtistName | ActiveFrom | CountryId | |------------+------------------+--------------+-------------| | 1 | Iron Maiden | 1975-12-25 | 3 | | 2 | AC/DC | 1973-01-11 | 2 | | 3 | Allan Holdsworth | 1969-01-01 | 3 | | 4 | Buddy Rich | 1919-01-01 | 6 | | 5 | Devin Townsend | 1993-01-01 | 8 | +------------+------------------+--------------+-------------+ SELECT TOP(5) * FROM Albums; +-----------+------------------------+---------------+------------+-----------+ | AlbumId | AlbumName | ReleaseDate | ArtistId | GenreId | |-----------+------------------------+---------------+------------+-----------| | 1 | Powerslave | 1984-09-03 | 1 | 1 | | 2 | Powerage | 1978-05-05 | 2 | 1 | | 3 | Singing Down the Lane | 1956-01-01 | 6 | 3 | | 4 | Ziltoid the Omniscient | 2007-05-21 | 5 | 1 | | 5 | Casualties of Cool | 2014-05-14 | 5 | 1 | +-----------+------------------------+---------------+------------+-----------+
Các bảng này thực sự chứa nhiều hơn 5 hàng. Tôi đã chọn 5 hàng trên cùng để bạn có được bức tranh về dữ liệu và cấu trúc bảng.
Bây giờ, hãy tưởng tượng tôi muốn thêm một cột được tính vào bảng đầu tiên.
Tôi muốn cột được tính toán cung cấp số lượng album của mỗi nghệ sĩ. Nói cách khác, tôi cần nó để đếm các album trong bảng khác - Albums
bảng.
Vì dữ liệu nằm trong một bảng khác nên tôi không thể tham chiếu dữ liệu đó trực tiếp từ bên trong một cột được tính toán. Nhưng thay vào đó, tôi có thể tạo một hàm do người dùng xác định và tham chiếu hàm đó từ bên trong cột được tính toán của mình.
Tạo hàm
Đây là một chức năng đơn giản đếm số lượng album từ một nghệ sĩ nhất định:
CREATE FUNCTION [dbo].[ufn_AlbumCount] (@ArtistId int) RETURNS smallint AS BEGIN DECLARE @AlbumCount int; SELECT @AlbumCount = COUNT(AlbumId) FROM Albums WHERE ArtistId = @ArtistId; RETURN @AlbumCount; END; GO
Tạo cột được tính toán
Bây giờ tôi đã tạo hàm, tôi có thể thêm một cột được tính toán tham chiếu đến nó.
ALTER TABLE Artists ADD AlbumCount AS dbo.ufn_AlbumCount(ArtistId);
Kiểm tra cột được tính toán
Bây giờ tôi có thể chạy một truy vấn đối với Artists
bảng để xem kết quả của cột đã tính của tôi:
SELECT TOP(10) * FROM Artists;
Kết quả:
+------------+------------------+--------------+-------------+--------------+ | ArtistId | ArtistName | ActiveFrom | CountryId | AlbumCount | |------------+------------------+--------------+-------------+--------------| | 1 | Iron Maiden | 1975-12-25 | 3 | 5 | | 2 | AC/DC | 1973-01-11 | 2 | 3 | | 3 | Allan Holdsworth | 1969-01-01 | 3 | 2 | | 4 | Buddy Rich | 1919-01-01 | 6 | 1 | | 5 | Devin Townsend | 1993-01-01 | 8 | 3 | | 6 | Jim Reeves | 1948-01-01 | 6 | 1 | | 7 | Tom Jones | 1963-01-01 | 4 | 3 | | 8 | Maroon 5 | 1994-01-01 | 6 | 0 | | 9 | The Script | 2001-01-01 | 5 | 1 | | 10 | Lit | 1988-06-26 | 6 | 0 | +------------+------------------+--------------+-------------+--------------+
Lập chỉ mục
Bạn chỉ có thể sử dụng cột được tính toán trong một chỉ mục nếu hàm do người dùng xác định mà nó gọi có các giá trị thuộc tính sau:
- IsDeterministic =true
- IsSystemVerified =true (trừ khi cột đã tính được duy trì)
- UserDataAccess =false
- SystemDataAccess =false