Uživatelský sloupec s voláním uložené procedury

PříspěvekNapsal: 03.09.2007 10:37
od jan.sindelar
V případě, že máme mnoho uživatelských sloupců nad různými tabulkami, ale definice sloupců jsou "podobné" (tedy sloupce jsou sice nad různými přehledy, ale vrací hodnotu na základě stejného mechanismu - například SELECT do stejných tabulek), je úprava těchto sloupců poměrně pracná. Změněný "klíčový SELECT" musíme ručně upravit u všech definic sloupců ve kterých se vyskytuje, což je pracné a může vést k chybám.

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ě.