Could you hire me? Contact me if you like what I’ve done in this article and think I can create value for your company with my skills.

June 4, 2012 / by Zsolt Soczó

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

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.

Could you hire me? Contact me if you like what I’ve done in this article and think I can create value for your company with my skills.

LEAVE A COMMENT

8 COMMENTS

  • cpctcg June 6, 2012

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

  • cpctcg June 6, 2012

    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: @

  • Soczó Zsolt June 6, 2012

    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.

  • cpctcg June 6, 2012

    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?

  • Morzel June 6, 2012

    É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

  • cpctcg June 8, 2012

    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.

  • Soczó Zsolt June 8, 2012

    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.

  • cpctcg June 8, 2012

    “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).