SQL Server Denali CTP3 – Nouveautés T-SQL

Bon, maintenant que SQL11 est installé, il ne reste plus qu’a tester les nouveautés.

Je vous propose dans un premier temps d’installer deux bases de données exemple conçues pour cette release CTP3 de Denali.

Tout d’abord, il faut télécharger les fichiers MDF des bases exemples sur CodePlex.

image

Alors oui, les fichiers portent encore le nom de SQL Server 2008R2. Peu importe en fait. On peut tout a fait restaurer n’importe quelle base de données pour mener à bien ces premiers tests. Pour les curieux, seule la propriété FileStream a été supprimée sur le table Production.Document.

Ensuite, il faut créer les bases de données (notez qu’il manque les fichiers LDF, les journaux de transaction). Cela constitue un très bon exercice pour “reconstruire” une base de données à partir de son seul fichier de données.

CREATE DATABASE AdventureWorksDenali
      ON (FILENAME = 'C:\Data\AdventureWorks2008R2_Data.mdf') 
      FOR ATTACH ;
GO

CREATE DATABASE AdventureWorksDWDenali
      ON (FILENAME = 'C:\Data\AdventureWorksDWDenali_Data.mdf') 
      FOR ATTACH ;
GO

Notez au passage que le numéro de version interne des bases pour la CTP3 est 700 …

Les journaux de transaction ont bien été recréés :

image

Pour commencer, voici quelques nouveautés du langage T-SQL.

Les fonctions logiques :

  • La commande IIF : celle ci permet, un peu comme sous Excel, de retourner une des deux valeurs en fonction de la condition. Il s’agit ni plus ni moins d’un raccourci d’écriture pour l’instruction CASE :

    USE AdventureWorksDenali
    GO
    
    SELECT BusinessEntityID,LoginID,
           IIF (MaritalStatus = 'M', 'Marié', 'Célibataire' ) AS Result
    FROM HumanResources.Employee
    
  • La commande CHOOSE qui permet de renvoyer une valeur d’un tableau représenté par son index. Même si je ne vois pas dans l’immédiat d’exemple de code qui tirerait bénéfice de cette nouvelle commande, gageons qu’il doit exister des applications.

    SELECT CHOOSE ( 3, 'Manager', 
      'Director', 
      'Developer',
      'Tester' ) AS Result;
    

Les fonctions de conversion :

  • La fonction PARSE (qui s’ajoute aux CAST et CONVERT) permet de convertir des données de type chaine de caractère vers Date/Time et vers des types numériques, avec la possibilité de donner une culture en option, ce qui permet de simplifier l’utilisation des formats de date (DMY,MDY, …). Lors de ce test, la fonction renvoie un erreur. Peut-être encore quelques bugs …

    SELECT PARSE('€987,65' AS money, 'fr-FR') AS Result
    
  • La fonction TRY_CONVERT qui permet de de simplifier la gestion de certaines erreurs de conversion. Le TRY_CONVERT renvoie la valeur dans la type souhaité si al conversion réussit. En cas d’erreur de conversion un NULL est renvoyé. L’instruction échoue seulement si la conversion explicite n’est pas permise.

    SELECT TRY_CONVERT(datetime2, '07/13/2011') AS Result
    SELECT TRY_CONVERT(datetime2, '13/07/2011') AS Result
    

image

  • La fonction TRY_PARSE, qui reprend le fonctionnement du TRY_CONVERT avec la fonction PARSE. En cas de succès la valeur dans le type destination est renvoyée, un NULL sinon. L’instruction échoue si la conversion n’est pas autorisée.

    SELECT IIF(TRY_PARSE('13/07/2011' AS datetime2) IS NOT NULL, 
      'Date non valide', 
      'Date valide') AS Result
    

image

Les fonctions chaines de caractères :

  • La fonction CONCAT qui prends 2 (ou plus) chaines de caractères pour les concaténer. Notez que les valeurs NULL sont converties en chaines vides.

    SELECT CONCAT(PersonType,' ',FirstName,' ',LastName) as [Nom Complet]
    FROM Person.Person
    

image

  • La fonction FORMAT qui permet de formater l’affichage d’une date de manière plus simple qu’en utilisant le CONVERT avec le paramètre style

    DECLARE @d DATETIME = GETDATE();
    SELECT FORMAT( @d, 'dd/MM/yyyy', 'en-US' ) AS Result
    SELECT FORMAT( @d, 'MM/dd/yyyy', 'en-US' ) AS Result
    SELECT FORMAT( @d, 'dd/MM/yyyy', 'fr-FR' ) AS Result
    SELECT FORMAT( @d, 'MM/dd/yyyy', 'fr-FR' ) AS Result
    

image

 

Fonctions date et heure :

  • Les fonctions <Date>FromParts qui permettent de reconstruire un date a partir de données numériques. Pour ma part, je pense que ces fonctions étaient attendues …

    SELECT DATEFROMPARTS ( 2011, 07, 13 ) AS Result;
    SELECT DATETIMEFROMPARTS ( 2011, 07, 13, 23, 59, 59, 0 ) AS Result;
    SELECT DATETIME2FROMPARTS ( 2011, 07, 13, 23, 59, 59, 0, 0 ) AS Result;
    SELECT DATETIMEOFFSETFROMPARTS ( 2011, 07, 13, 14, 23, 23, 0, 12, 0, 7 ) AS Result;
    SELECT SMALLDATETIMEFROMPARTS ( 2011, 07, 13, 23, 59 ) AS Result
    SELECT TIMEFROMPARTS ( 23, 59, 59, 0, 0 ) AS Result;
    

image

  • La fonction EOMONTH qui permet de connaitre le dernier jour du mois de la date passée en paramètre. Optionnellement, il est possible de décaler le mois. Il n’y a plus de problème avec les années bissextiles, on peut immédiatement savoir si le 29 févier est une date valide …

    DECLARE @date DATETIME;
    SET @date = '2/18/2011';
    SELECT EOMONTH ( @date ) AS Result;
    SET @date = '2/18/2012';
    SELECT EOMONTH ( @date ) AS Result;
    
    SELECT DatePart(YEAR,EOMONTH ( @date )),
      IIF(DatePart(dd,EOMONTH ( @date )) = 29, 
               'Année bissextile',
               'Années normale') AS Result
    

image

 

J’avais déjà abordé les séquences dans un précédent billet.

Pour ceux qui font usages des blocs TRY/CATCH, une nouveauté vraiment intéressante est apparue : la possibilité de “relever” l’exception, afin de la transmettre à l’appelant. Les langages de programmation proposaient cette possibilité depuis bien longtemps, voilà une lacune de SQL Server comblée.

BEGIN TRY
    SELECT 1 / 0
END TRY
BEGIN CATCH
    PRINT 'Dans le bloc CATCH';
END CATCH;

 

image

On provoque un erreur, le bloc catch fait son office et permet de traiter l’erreur, sans que l’information remonte à l’appelant. Ajoutons maintenant la commande THROW (attention, une fois n’est pas coutume, cette instruction doit être suivie d’un “;”)

BEGIN TRY
    SELECT 1 / 0
END TRY
BEGIN CATCH
    PRINT 'Dans le bloc CATCH';
	THROW;
END CATCH;

image

L’instruction THROW accepte éventuellement des paramètres si vous souhaitez changer le numéro ou le message d’erreur.

Les instructions OFFSET et FETCH afin de paginer le jeu de données sont au rendez-vous. Je vous renvoie au billet que j’ai écrit il y a quelques mois.

la clause OVER a aussi évolué. Je vous prépare un post spécifique sur le sujet.

Voilà donc quelques nouveautés du langage apportées par SQL11. Vous pouvez d’ores et déjà coder les prochaines applications en pensant à ces fonctionnalités qui vont, à n’en pas douter, vous être utiles …

A propos Christophe

Consultant SQL Server Formateur certifié Microsoft MVP SQL Server MCM SQL Server 2008
Cet article, publié dans SQL Server, est tagué , . Ajoutez ce permalien à vos favoris.

2 commentaires pour SQL Server Denali CTP3 – Nouveautés T-SQL

  1. Marc Chouteau dit :

    Il était temps pour la gestion des dates si je puis dire😉

  2. Ping : SQL Server 2012–vos attentes, mes démos | Christophe LAPORTE – Consultant SQL Server

Laisser un commentaire

Entrez vos coordonnées ci-dessous ou cliquez sur une icône pour vous connecter:

Logo WordPress.com

Vous commentez à l'aide de votre compte WordPress.com. Déconnexion / Changer )

Image Twitter

Vous commentez à l'aide de votre compte Twitter. Déconnexion / Changer )

Photo Facebook

Vous commentez à l'aide de votre compte Facebook. Déconnexion / Changer )

Photo Google+

Vous commentez à l'aide de votre compte Google+. Déconnexion / Changer )

Connexion à %s