Soci (Soczó Zsolt) szakmai blogja

2012.06.04.

SQL Server 2012 újdonságok – 7. Új TSQL függvények

Filed under: Adatbázisok,SQL Server,SQL Server 2008 R2,Szakmai élet — Soczó Zsolt @ 22:35

Számos új függvény teszi egyszerűbbé a mindennapi TSQL programozást. A függvények egy része az Excel vagy az Access függvényeihez hasonló, megkönnyítve az ezeken írt alkalmazások átírását SQL Server 2012-re.
Számos új dátumkezelő függvényünk van. Az eomonth visszaadja egy adott dátumhoz tartozó hónap utolsó napját (kezelve szökőéveket, stb.). A második paraméterével át lehet térni egy másik hónapra is:

declare @currentdate datetime = '20120225';
select 
eomonth (@currentdate) as 'EOMMonth',
eomonth (@currentdate, -2) as 'EOM2MonthsEarlier',
eomonth (@currentdate, 1) as 'EOM1MonthLater';

Dátum összerakása a komponenseiből:

declare @Year int = 2011;
declare @Month int = 2;
declare @Day int = 29;

select datefromparts(@Year, @Month, @Day) AS Result;

Hasonló függvények készültek a többi típushoz is: datetimefromparts, datetime2fromparts, datetimeoffsetfromparts, smalldatetimefromparts, timefromparts.
A típusok közötti konverzió sokkal egyszerűbbé vált. Egyrészt most már van try_convert, ami az eddigi convert függvénnyel ellentétben nem dob hibát, ha nem sikerül a konverzió, hanem nullt ad vissza:

select TRY_CONVERT(float, 'test') F
, TRY_CONVERT(datetime2, '2012-05-15') D1
, TRY_CONVERT(datetime2, '2012-05-15.') D2
, TRY_CONVERT(datetime2, '2012-05-45') D3
, TRY_CONVERT(datetime2, '25/04/2020', 103) D4;	--British/French: dd/mm/yyyy

A .NET-ből ismert alaptípusok Parse, TryParse és ToString metódusát is kivezették, így ezekkel gazdag, szabályozható formátumú és kultúrafüggő értelmezési és formázási lehetőségek jelentek meg az SQL Serverben.

SELECT PARSE('7/17/2011' AS DATE USING 'en-US') AS dt1,
PARSE('2011.07.17.' AS DATE USING 'hu-HU') AS dt2;

Az en-US angol nyelv, USA-ban értelmezve, a hu-HU magyar nyelv, Magyarországon értelmezve.
A format függvény segítségével a .NET-es típusok ToStringjét hívhatjuk meg, amivel rendkívül egyszerű összetett formázásokat is megvalósítani:

declare @Price decimal(19,4) = 13542.1251;
declare @Date datetime2(0) = '20120425 15:13:00';
select 
	--Pénzösszegek
	format(@Price, 'C4', 'hu-hu') HunPrice, --13 542,1251 Ft
	format(@Price, 'C4', 'en-us') UsPrice,  --$13,542.1251	
	--Dátumok
	format(@Date, 'D', 'hu-hu') HunDate,    --2012. április 25.
	format(@Date, 'D', 'en-us') UsDate,     --Wednesday, April 25, 2012 
	format(@Date, 'd', 'hu-hu') HunDate2,
	format(@Date, 'd', 'en-us') UsDate2,
	format(@Date, 'f', 'hu-hu') HunDate3,
	format(@Date, 'f', 'en-us') UsDate3,
	--Custom format string
	format(@Date, 'yyyy.MM.dd') HuncutDate3,
	--Számok formázása
	format(@Price, 'F2', 'hu-hu') HunNumber,
	format(@Price, 'F2', 'en-us') UsNumber,
	format(@Price, '00000', 'en-us') LeadingZerosNumber,
	format(@Price, 'N2', 'hu-hu') HunGroupedNumber,
	format(@Price, 'N2', 'en-us') UsGroupedNumber;

Az eddig case-ekkel megvalósított logikai kifejezések egy részét egyszerűbben is meg tudjuk fogalmazni az iif és a choose függvényekkel:

select 
a = iif(1=1, 'cica', 'kutya'),	--cica
b = iif(1=2, 'cica', 'kutya'),      --kutya
n = iif(null = 1, 'cica', 'kutya'); --kutya

A choose az n. argumentumot adja vissza, 1-gyel kezdődő sorszámmal:

select 
choose(1, 'a', 'b', 'c') as 'first', 
choose(2, 'a', 'b', 'c') as 'second';

A concat függvénnyel szövegeket lehet egybefűzni. Abban különbözik a + operátortól, hogy mivel a paraméterei stringek, ha más típus megy be paraméterül, az automatikusan stringgé konvertálódik, így biztosan stringként kerül összefűzésre . A másik különbség, hogy a NULL paraméterek helyett üres stringet helyettesít be, míg a + operátor alap set opciók esetén NULL-t ad vissza.

declare @PurchaseOrderNumber int = 123;
select concat('PO', @PurchaseOrderNumber) PO1, 
concat('PO', NULL, @PurchaseOrderNumber) PO2;

Bár az adatok formázása általában nem az adatbázis, hanem a megjelenítési réteg feladata, ennek ellenére sokszor kellett eddig is például számokat vagy dátumokat formázni SQL-ben is. Az új függvényekkel a .NET formázások teljes repertoárja elérhető az SQL programozók részére is.

8 Comments

  1. Akkor talán sikerült megvalósítaniuk a trim függvényt is, vagy csak nekem nyűg az ilyen:
    select @ = ltrim(rtrim(@))

    Comment by cpctcg — 2012.06.06. @ 12:26

  2. Egyébként mért jó rövid kódban az egyetlen lokális változónak pl. ilyen hosszú nevet adni: @currentdate?
    Átláthatóbb, egyszerűbb és garantáltan kevesebbet kell hozzá gépelni: @

    Comment by cpctcg — 2012.06.06. @ 12:33

  3. Trim nincs, ez balfaszság.

    @ mint változónév, erről ez jut eszembe:
    How To Write Unmaintainable Code

    http://thc.org/root/phun/unmaintain.html

    Underscore, a Friend Indeed
    Use _ and __ as identifiers.

    De ilyen Móricka példában @d elég lett volna.

    Comment by Soczó Zsolt — 2012.06.06. @ 14:39

  4. Pontosan a mórickapéldákra gondoltam, amelyek általában _rövidek_ és _egyetlen_ _lokális_ változóval bírnak. És még azt nem értem, hogy az első példában miért nem csökkentetted le egyetlen kukacra a változónevet, miért kell a kukac mögé a d?

    Comment by cpctcg — 2012.06.06. @ 18:15

  5. Én éles projektben láttam egy kb. 500 soros javascript metódusban ilyet:

    __[_] = …

    Azt hittem eldobom az agyam.

    Ha nem ment volna már addigra el az ember aki készítette, szívesen felpofoztam volna. A metódus fele ilyenekkel volt tele. Majd kifolyt a szemem mire kibogoztam hogy mit akar csinálni…

    Morzel

    Comment by Morzel — 2012.06.06. @ 19:32

  6. Hát fiúk, ha egy T-SQL-es, pársoros rutinban, amiben pont 1 lokális változó vesz részt, még véletlenül sem adjátok azt a “nevet”, hogy @, hanem tegyetek mögé egy karaktert, mert az javítani fog az olvashatóságán. :)
    Bocsánat, de mosolyognom kell! :)

    Azt pláne nem értem, hogy a @-nak mi köze az _-hoz olvashatóságát tekintetében. Ugye ti se! (Most nem mosolygok.)

    Érdekes, hogy amikor az embere rákattan egy vágányra, akkor nehéz kibillenteni belőle. Ti ráálltatok arra, hogy láttatok egy aláhúzást változónévként, sőt még cikket is olvastatok, és valahogy összekeveritek a szezont a fazonnal, mert az egykarakteres, betűből álló változóneveket nem ítélitek el, de egy kukacot, ami szó szerint ÉKTELENKEDIK, az összehasonlítjátok a tényleg nehezen észrevehető _-sal.

    Comment by cpctcg — 2012.06.08. @ 11:37

  7. A stíluson vitatkozni szerintem parttalan vita, ez esztétika kérdése, megszokásé, ezért hívják névkonvencióknak és nem név szabályoknak. Mindenki úgy használja, ahogy jólesik, én írok hosszú neveket, mert az a mániám, más meg kukacol.

    Comment by Soczó Zsolt — 2012.06.08. @ 12:32

  8. “A jó nevek megválasztása is egyfajta művészet.”

    “A nagy hatókörű nevek lehetőleg hosszúak és érthetőek legyenek, mint vector, Window_with_border és Department_number. A kód viszont érthetőbb lesz, ha a kis hatókörben használt neveknek rövid, hagyományos stílusú nevük van, mint x, i és p. Az osztályok és a névterek használhatók arra, hogy a hatókörök kicsik maradjanak.”

    Szerintem tényleg kár rajta vitatkozni, de ő okosabb mindkettőnknél, és én neki hiszek, meg persze magamnak. Jó érzés, hogy egy olalon állunk (ő meg én).

    Comment by cpctcg — 2012.06.08. @ 22:06

RSS feed for comments on this post.

Sorry, the comment form is closed at this time.

Powered by WordPress