Microsoft heeft het voornemen om dit voorjaar de volgende versie van SQL Server uit te bregen. De werknaam van deze release is Denali, en onder deze naam zijn al diverse CTP’s en laatselijk ook de Release Candidate 0 verschenen. De commerciele naam van dit product zal SQL Server 2012 zijn, en met het verschijnen van de Release Candidate staat de feature set vast en zal alleen het hoognodige bijgeslepen worden.

In een blog wil ik stilstaan bij een aantal in het oog springende nieuwe features in T-SQL, welke het leven van de T-SQL programmeur verder veraangenamen.

TRY_CONVERT

Hoe vaak gebeurt het niet dat we in T-SQL iets proberen te converteren met CONVERT of CAST terwijl dit niet blijkt te kunnen. Hele programma in de soep, of A4’tjes aan code schrijven om de fouten af te vangen.

Beschouw:

  1: DECLARE @eenvariabele int
  2: SET @eenvariabele = CONVERT(int, 'abcd')
  3: SELECT @eenvariabele

Helaas, resulteert in: ‘Conversion failed when converting the varchar value 'abcd' to data type int.’

Jammer, maardus wel een runtime error, programma onderbroken, tenzij de fout afgevangen wordt, kun je daar weer iets mee…

  1: DECLARE @eenvariabele int
  2: BEGIN TRY
  3: 	SET @eenvariabele = CONVERT(int, 'abcd')
  4: END TRY
  5: BEGIN CATCH
  6: 	SET @eenvariabele = NULL
  7: END CATCH
  8: SELECT @eenvariabele

Ok, maar als het resultaat een geldige waarde moet zijn of NULL als input niet juist blijkt te zijn, kunnen we in SQL Server 2012 dus ook:

  1: DECLARE @eenvariabele int
  2: SET @eenvariabele = TRY_CONVERT(int, 'abcd')
  3: SELECT @eenvariabele

En dit gaat altijd goed

FORMAT

Waren we net gewend aan .ToString in .NET, komt SQL Server met iets nieuws…. Voor de oudegedienden in VB is Format niet nieuw, in VB6 en VBA veelvuldig gebruik van gemaakt om weergave van numerieke en date-gerelateerde gegevens in een bepaald format te dwingen.

  1: SELECT FORMAT(5,'0000')
  2: SELECT FORMAT(GETDATE(),'yyyyMM')

Resulteert in ‘0005’ en ‘201201’

Niet ingewikkeld en no more SELECT RIGHT(‘0000’ + CONVERT(varchar,5),4), maar wel fijn…

FETCH & OFFSET

Als men bijvoorbeeld de eerste 100 records uit een resultaatset wil, is de volgende oplossing simpel

  1: SELECT TOP 100
  2: 	*
  3: FROM
  4: 	Person.Contact
  5: ORDER BY
  6: 	LastName

 

Simpel, maar nu willen we de volgende 100. In SQL 2008 nog complex met derived tables en ROW_NUMBER, in SQL 2012:

  1: SELECT 
  2: 	*
  3: FROM
  4: 	Person.Contact
  5: ORDER BY
  6: 	LastName
  7: OFFSET 100 ROWS
  8: FETCH NEXT 100 ROWS ONLY
  9: 

LAG & LEAD

Met deze features blijkt het zeer eenvoudig om data uit een vorig of volgend record in een resultaatset te benaderen, zonder complexe self-joins.

Met LAG kunnen we data uit een vorig record benaderen, waarbij dmv de offset parameter bepaald kan worden hoever terug gekeken moet worden.

Met LEAD kijken we naar records volgend op het geselecteerde. Belangrijk ook om een volgorde op te geven en een default, indien er geen volgend ov vorig record gevonden wordt.

Syntax: LAG/LEAD(expression, offset, default) OVER (order)

  1: SELECT 
  2: 	Jaar,
  3: 	Maand,
  4: 	Omzet,
  5: 	LAG(Omzet, 1, 0) OVER (ORDER BY Jaar,Maand) AS OmzetVorigeMaand
  6: FROM
  7: 	Omzet
  8: 
  9: SELECT 
 10: 	Jaar,
 11: 	Maand,
 12: 	Omzet,
 13: 	LEAD(Omzet, 1, 0) OVER (ORDER BY Jaar,Maand) AS OmzetVolgendeMaand
 14: FROM
 15: 	Omzet
 16: 

 

 

EOMONTH

 

  1: SELECT
  2: 	EOMONTH(GETDATE()) AS EindeActueleMaand

 

Geeft altijd de laatste dag van de maand gegeven een input datum, al dat DATEADD gedoe, nergens meer voor nodig.

En meer

CONCAT(), CHOOSE(), IIF(), DATEFROMPARTS(), LOG()

Denk wat je er van denkt (is het VB6, .NET of T-SQL), maar wel erg gemakkelijk