Určitým řešením, které lze v mnoha případech využít, je vytvořit si uživatelskou funkci, kterou pak definice uživatelského sloupce použije, a nebo SELECTem dokonce zavolat uloženou proceduru. Při potřebě změnit definici uživatelského sloupce pak stačí pouze změnit definici funkce/procedury a není nutné upravovat všechny uživatelské sloupce samostatně.
a) Uživatelská funkce
Definuje se podobně jako uložená procedura a na základě vstupních parametrů (např. ID záznamu) vrací hodnotu nebo dokonce tabulku hodnot. V případě uživatelských sloupců však musíme použít funkci, která vrací pouze jednu hodnotu. Definice může vypadat zhruba takto:
- Kód: Vybrat vše
CREATE FUNCTION moje_funkce(@ID INT)
RETURNS VARCHAR(10)
AS
BEGIN
DECLARE @str VARCHAR(10)
...
...
...
RETURN @str
END
Tímto způsobem můžeme nadefinovat jednoduchou funkci, která na základě ID vrací textový řetězec. Lze použít i více vstupních parametrů.
V definici uživatelského sloupce je pak možné funkci zavolat stejně jako standardní systémové funkce (SUM, MAX, MIN apod.), tedy kupříkladu takto:
- Kód: Vybrat vše
(SELECT dbo.moje_funkce(ID))
b) Volání uložené procedury SELECTem
S využitím jednoduchého triku lze zavolat SELECTem i uloženou proceduru. Použijeme k tomu připojení přes linked server a funkci OPENQUERY. S použitím linked serverů se lze připojit na externí datový zdroj a zavolat prakticky libovolný SQL příkaz, tedy i EXEC uložené procedury. Kromě externích zdrojů se ovšem můžeme připojit i na server "lokální", tedy server, na kterém běží databáze Heliosu (=připojím se "sám na sebe").
Definice uživatelského sloupce pro volání uložené procedury pak může vypadat zhruba takto:
- Kód: Vybrat vše
(SELECT * FROM OPENQUERY([JMENO_SERVERU], 'EXEC Helios001.dbo.moje_procedura'))
Samotná procedura musí opět vracet pouze jednu hodnotu a to přímo SELECTem na konci těla procedury, protože nelze využít výstupních parametrů.
Upozornění: Již samotné uživatelské sloupce jako takové zpomalují zobrazení výsledného přehledu (je to další vnořený SELECT). Pokud navíc použijete uživatelskou funkci a nebo dokonce volání uložené procedury přes linked server, načtení výsledného přehledu se ještě více zpomalí. Proto se doporučuje volit toto řešení velmi uvážlivě a spíše výjimečně.