ceturtdiena, 2010. gada 11. novembris

SQL Server iebūvētās funkcijas

Rakstā vienuviet apvienotas funkcijas, kas var noderēt ikdienas darbā strādājot ar SQL Server. Dotas saites uz MSND rakstiem, kur funkciju skaidrojumi.

Lietotāja vārda (un ar to saistītais) iegūšana
Svarīga nianse ir "lietotāja vārds = login name" un "pieslēguma vārds = user name" (droši vien- visbiežāk varētu interesēt original_login()):
  • original_login() atgriež orģinālo lietotāja vārdu (login name) ar ko lietotājs pieslēdzies serverim. Svarīgi tad, ja procedūra, funkcija, trigeris izmanto "execute as".
  • suser_sname() tiks atgriezts lietotāja vārds (login name). Kā parametru var padot SID (security identification number). Izmantojot "execute as"- konteksta lietotāja vārds.
  • system_user() ja pieslēdzies domēna lietotāju izmantojot windows autentifikāciju, tad domēna lietotāja vārds. Citos gadījumos- pieslēguma vārds (user name). Izmantojot "execute as"- konteksta lietotāja vārds.
  • user pieslēguma vārds (user name). Izmantojot "execute as"- konteksta lietotāja vārds.
  • user_name() pieslēguma vārds (user name). Izmantojot "execute as"- konteksta lietotāja vārds. kā parametru var padot UID (user ID)
  • suser_sid() lietotāja SID (security identification number). Izmantojot "execute as"- konteksta lietotāja vārds. funkcijai var padot kā parametru lietotāja vārdu (login name)
  • current_user pieslēguma vārds (user name). Izmantojot "execute as"- konteksta lietotāja vārds.
Citas noderīgas funkcijas:
Un daudz daudz citu:

      4 komentāri:

      1. Man kā zvērinātam Oracle lietotājam pietrūkst tādas funkcijas kā LEAD, LAG tikai nesen izdevās atrast risinājumu, zemāk ideja:
        Ir divas tabulas products(ID,NAME) un product_prices(PRODUCT_ID,SUMMA, DATUMS) kur datums ir no kura šī cena ir spēkā, es vēlos uzzināt kāda bija iepriekšējā cena un no kura datuma un visu to vienā rindā. Izpalīdz šāds sql

        WITH MyCTE ( id,name,summa,datums,RowVersion )
        AS(
        select id,name,summa,datums,
        ROW_NUMBER() OVER(PARTITION BY ID ORDER BY datums DESC) RowVersion
        from dbo.products left outer join dbo.product_prices on id = product_id
        )
        SELECT
        BASE.name,
        BASE.summa,
        BASE.datums,
        lead.summa iepr_summa,
        lead.datums iepr_izm
        FROM MyCTE BASE
        LEFT JOIN MyCTE LEAD ON BASE.id = LEAD.id
        AND BASE.RowVersion = LEAD.RowVersion-1
        order by 1,3 desc

        atgriež smuku rezultātu

        name summa datums iepr_summa iepr_izm
        alus NULL NULL NULL NULL
        siers 3.00 2010-05-15 2.05 2010-02-01
        siers 2.05 2010-02-01 2.00 2010-01-01
        siers 2.00 2010-01-01 NULL NULL

        šis gan nav tas labākais piemērs, bet ideja cerams, ka skaidra.
        P. S alum man bija slinkums ievadīt cenu

        AtbildētDzēst
      2. Par šo minēto problēmu tieši gribēju uzrakstīt rakstiņu (tas stāv rindā). Man bij līdzīga situācija- tikai vajadzēja iegūt pēdējās darbības. Biju risinājis gan savādāk, bet ar row_number() palīdzību to varēja pataisīt ātrāku.

        AtbildētDzēst
      3. Yep analītiskajās aka ranking funkcijās SQL Serveris diezgan atpaliek, to vienkārši ir krietni mazāk, nav arī, piemēram, arī slīdošo logu (sliding window) f-ju. Par tām es rakstīju reiz šeit:
        http://datubazes.wordpress.com/2008/08/21/analitiskas-funkcijas/

        Toties kā mēs zinām nesenajā seminārā, kur šķiet arī Jānis piedalījās, mums stāstīja par MS Excel graujošajiem ātrdarbības uzlabojumiem, kur to visu izdarīt ar' nav īpašu problēmu ;)

        BTW oracle 11g ir uzradusies f-ja nth_value, kura relatīvi tradicionālo uzdevumu atrast nto vērtību sakārtojumā ir pārvērtusi bērnu spēlē ;)

        AtbildētDzēst
      4. Uzrakstīju rakstiņu gandrīz par to pašu, ko biju domājis (skatīt iepriekšējos komentārus). http://www.sqlblog.lv/2011/01/piemers-vaicajums-izmantojot-analitisko.html

        AtbildētDzēst