Pokročilé hledání             

HELIOS iNuvio      FAQ     Uživatelský panel    

Registrovat     Přihlásit se

    Obsah fóra> Časté dotazy> Systémové dotazy
    Verze pro tisk

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

Zapisují se opakující se dotazy na řešení systémových problémů z provozu Helios Orange. Patří sem dotazy typu "Po instalaci SQL serveru se nemohu přihlásit do Heliosu." apod.

Moderátor: orange_moderator

Odeslat odpověď
Příspěvek: 1 • Stránka 1 z 1
  • Odpovědět s citací

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

Příspěvekod jan.sindelar v 03.09.2007 10:37

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ě.
jan.sindelar
 
Příspěvky: 23
Registrován: 06.10.2006 13:37
Firma: Asseco Solutions, a.s.
Nahoru

Odeslat odpověď
Příspěvek: 1 • Stránka 1 z 1

Zpět na Systémové dotazy

Kdo je online

Uživatelé procházející toto fórum: Žádní registrovaní uživatelé a 4 návštevníků

         
  • Tým • Smazat všechny cookies z fóra • Všechny časy jsou v UTC + 1 hodina
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group, Český překlad – phpBB.cz

© copyright 2024 Asseco Solutions, a.s.