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
Akkor talán sikerült megvalósítaniuk a trim függvényt is, vagy csak nekem nyűg az ilyen:
select @ = ltrim(rtrim(@))
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: @
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.
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?
É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
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.
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.
“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).