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.
- host_name() datora, no kā pieslēdzies lietotājs, nosaukums.
- @@spid sesijas identifikators (Session ID)
- app_name() Programmas, ar ko pieslēdzies lietotājs, nosaukums (rakstiņš šajā sakarā- Programmas nosaukuma norādīšana)
- getdate() Datums un laiks (servera). Papildus tam var noderēt rakstiņi-
* Datumi. Noderīgas funkcijas
* Piemērs: Funkcija, lai iegūtu datumus laika intervālā - db_name() Nosaukums datu bāzei, ar ko strādā. Kā parametru var padod datu bāzes iedentifikatoru.
- Sistēmas funkcijas (@@ERROR, APP_NAME, @@IDENTITY, UPDATE(), ...)
- Konfigurācijas funkcijas, MSD (@@DATEFIRST, @@OPTIONS, @@VERSION, ...)
- Funkcijas darbam ar tekstu (SUBSTRING, REPLICATE, LEN, CHARINDEX, ...)
- Funkcijas darbam ar datumiem (GETDATE, DAY, DATEADD, ...)
- Visas iepriekšminētās un vispār visas iebūvētās funkcijas SQL Server
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:
AtbildētDzēstIr 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
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ēstYep 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:
AtbildētDzēsthttp://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ē ;)
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