Batasan kolom terkomputasi yang diketahui secara luas di SQL Server adalah kolom tersebut tidak dapat mengakses data dari tabel lain. Artinya, ekspresi Anda dapat menggunakan kolom dalam tabel yang sama, tetapi tidak dari tabel lain.
Tapi ini hanya setengah benar. Meskipun Anda tidak dapat mereferensikan kolom tabel lain secara langsung dalam ekspresi Anda, Anda dapat memanggil fungsi yang ditentukan pengguna. Oleh karena itu, Anda dapat membuat fungsi yang ditentukan pengguna yang melakukan penghitungan yang Anda perlukan, lalu cukup panggil fungsi tersebut sebagai ekspresi kolom yang dihitung.
Berikut ini contoh untuk didemonstrasikan.
Tabel Contoh
Saya memiliki database dengan tabel berikut:
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 | +-----------+------------------------+---------------+------------+-----------+
Tabel ini sebenarnya berisi lebih dari 5 baris. Saya telah memilih 5 baris teratas sehingga Anda mendapatkan gambaran tentang data dan struktur tabel.
Sekarang, bayangkan saya ingin menambahkan kolom terhitung ke tabel pertama.
Saya ingin kolom yang dihitung untuk memberikan jumlah album dari setiap artis. Dengan kata lain, saya membutuhkannya untuk menghitung album di tabel lain – Albums
tabel.
Melihat data ada di tabel lain, saya tidak bisa merujuknya langsung dari dalam kolom yang dihitung. Tetapi saya dapat membuat fungsi yang ditentukan pengguna sebagai gantinya, dan merujuk fungsi itu dari dalam kolom yang saya hitung.
Buat Fungsi
Berikut adalah fungsi sederhana yang menghitung jumlah album dari artis tertentu:
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
Buat Kolom yang Dihitung
Sekarang setelah saya membuat fungsi, saya dapat menambahkan kolom terhitung yang mereferensikannya.
ALTER TABLE Artists ADD AlbumCount AS dbo.ufn_AlbumCount(ArtistId);
Uji Kolom yang Dihitung
Sekarang saya dapat menjalankan kueri terhadap Artists
tabel untuk melihat hasil kolom yang saya hitung:
SELECT TOP(10) * FROM Artists;
Hasil:
+------------+------------------+--------------+-------------+--------------+ | 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 | +------------+------------------+--------------+-------------+--------------+
Pengindeksan
Anda hanya dapat menggunakan kolom yang dihitung dalam indeks jika fungsi yang ditentukan pengguna yang dipanggil memiliki nilai properti berikut:
- ApakahDeterministik =benar
- IsSystemVerified =true (kecuali kolom yang dihitung tetap ada)
- UserDataAccess =salah
- SystemDataAccess =salah