Všeobecně známé omezení počítaných sloupců na SQL Serveru je, že nemají přístup k datům z jiných tabulek. To znamená, že váš výraz může používat sloupce ve stejné tabulce, ale ne z jiných tabulek.
Ale to je jen poloviční pravda. I když přímo ve výrazu nemůžete odkazovat na sloupec jiné tabulky, můžete vyvolat uživatelem definovanou funkci. A proto můžete vytvořit uživatelem definovanou funkci, která provede výpočet, který potřebujete, a poté tuto funkci jednoduše zavolat jako výraz vašeho vypočítaného sloupce.
Zde je příklad k demonstraci.
Ukázkové tabulky
Mám databázi s následujícími tabulkami:
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 | +-----------+------------------------+---------------+------------+-----------+
Tyto tabulky ve skutečnosti obsahují více než 5 řádků. Vybral jsem prvních 5 řádků, abyste si udělali obrázek o struktuře dat a tabulky.
Nyní si představte, že chci přidat vypočítaný sloupec do první tabulky.
Chci, aby sloupec vypočítaný uváděl počet alb od každého interpreta. Jinými slovy, potřebuji to k počítání alb v další tabulce – Albums
tabulka.
Vzhledem k tomu, že data jsou v jiné tabulce, nemohu na ně přímo odkazovat z vypočítaného sloupce. Ale mohu místo toho vytvořit uživatelsky definovanou funkci a odkazovat na tuto funkci z mého vypočítaného sloupce.
Vytvořte funkci
Zde je jednoduchá funkce, která počítá počet alb od daného interpreta:
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
Vytvořte vypočítaný sloupec
Nyní, když jsem vytvořil funkci, mohu přidat vypočítaný sloupec, který na ni odkazuje.
ALTER TABLE Artists ADD AlbumCount AS dbo.ufn_AlbumCount(ArtistId);
Otestujte vypočítaný sloupec
Nyní mohu spustit dotaz na Artists
tabulka pro zobrazení výsledku mého vypočítaného sloupce:
SELECT TOP(10) * FROM Artists;
Výsledek:
+------------+------------------+--------------+-------------+--------------+ | 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 | +------------+------------------+--------------+-------------+--------------+
Indexování
Vypočítaný sloupec v indexu můžete použít pouze v případě, že uživatelsky definovaná funkce, kterou vyvolává, má následující hodnoty vlastností:
- IsDeterministic =pravda
- IsSystemVerified =true (pokud vypočítaný sloupec není trvalý)
- UserDataAccess =nepravda
- SystemDataAccess =nepravda