Les Bases Fondamentales Du Langage Transact SQL

Embed Size (px)

Citation preview

  • Les bases fondamentales

    du langage Transact SQL Version 1.0

    Grgory CASANOVA

    James RAVAILLE

    http://blogs.dotnet-france.com/jamesr

  • Dotnet France Association Grgory CASANOVA / James RAVAILLE

    2 Les bases fondamentales du langage Transact SQL

    Sommaire

    1 Introduction ..................................................................................................................................... 4

    2 Pr-requis ........................................................................................................................................ 5

    2.1 Prsentation ............................................................................................................................ 5

    2.2 Les expressions ........................................................................................................................ 5

    2.3 Les oprateurs ......................................................................................................................... 6

    2.4 Les fonctions ............................................................................................................................ 7

    3 Les instructions DML ..................................................................................................................... 12

    3.1 Prsentation .......................................................................................................................... 12

    3.2 Cration, modification et suppression de donnes .............................................................. 12

    3.2.1 Linstruction INSERT ...................................................................................................... 12

    3.2.2 Linstruction UPDATE ..................................................................................................... 14

    3.2.3 Linstruction DELETE ...................................................................................................... 15

    3.3 Lire et trier des donnes ....................................................................................................... 16

    3.3.1 Linstruction SELECT ...................................................................................................... 16

    3.3.2 Changer le nom des colonnes (ALIAS) ........................................................................... 16

    3.3.3 La condition WHERE ...................................................................................................... 17

    3.3.4 Les projections de donnes ........................................................................................... 18

    3.3.5 Les calculs simples ......................................................................................................... 20

    3.3.6 Le produit cartsien ....................................................................................................... 20

    3.3.7 Les jointures .................................................................................................................. 21

    3.3.8 La close ORDER BY ......................................................................................................... 23

    3.3.9 Loprateur UNION ........................................................................................................ 24

    3.3.10 Loprateur EXCEPT ....................................................................................................... 25

    3.3.11 Loprateur INTERSECT .................................................................................................. 25

    3.3.12 La clause TOP ................................................................................................................. 26

    3.3.13 Crer une table grce SELECT INTO ............................................................................ 26

    3.3.14 La clause COMPUTE et COMPUTE BY ............................................................................ 27

    3.3.15 Les oprateurs ROLLUP et CUBE ................................................................................... 28

    3.3.16 Loprateur OVER .......................................................................................................... 29

    3.3.17 Loprateur NTILE .......................................................................................................... 30

    3.3.18 Les sous-requtes .......................................................................................................... 30

  • Dotnet France Association Grgory CASANOVA / James RAVAILLE

    3 Les bases fondamentales du langage Transact SQL

    3.3.19 Les instructions PIVOT et UNPIVOT ............................................................................... 30

    3.3.20 Linstruction MERGE ...................................................................................................... 32

    4 Le SQL Procdural .......................................................................................................................... 33

    4.1 Les variables .......................................................................................................................... 33

    4.1.1 Les variables utilisateur ................................................................................................. 33

    4.1.2 Les variables systme .................................................................................................... 33

    4.2 Les transactions ..................................................................................................................... 33

    4.3 Les lots et les scripts .............................................................................................................. 34

    4.4 Le contrle de flux ................................................................................................................. 35

    4.4.1 Linstruction RETURN..................................................................................................... 35

    4.4.2 Linstruction PRINT ........................................................................................................ 35

    4.4.3 Linstruction CASE .......................................................................................................... 36

    4.4.4 Les blocs BEGIN END .................................................................................................. 36

    4.5 La gestion des curseurs ......................................................................................................... 38

    4.6 Les exceptions ....................................................................................................................... 41

    4.6.1 Lever une exception ...................................................................................................... 41

    4.6.2 Gestion des erreurs dans le code .................................................................................. 42

    5 Conclusion ..................................................................................................................................... 43

  • Dotnet France Association Grgory CASANOVA / James RAVAILLE

    4 Les bases fondamentales du langage Transact SQL

    1 Introduction Dans ce cours, nous allons tudier les bases du langage Transact SQL. La version du langage

    Transact SQL utilise est celle de SQL Server 2008. Pour ce faire, nous allons dfinir les diffrentes

    parties du langage (DML, DDL, DCL), puis dtailler la partie DML, qui est celle qui sert manipuler les

    donnes de faon gnrale.

  • Dotnet France Association Grgory CASANOVA / James RAVAILLE

    5 Les bases fondamentales du langage Transact SQL

    2 Pr-requis Avant de lire ce cours, nous vous conseillons :

    - Davoir dj utilis linterface dadministration de SQL Server 2008 : SQL Server Management

    Studio (Chapitre 1).

    - Davoir les bases dans la construction dun modle relationnel de donnes (Chapitre 2).

    - Les bases fondamentales du langage T-SQL

    2.1 Prsentation Le T-SQL (Transact Structured Query Langage) est un langage de communication avec une

    base de donnes relationnelle SQL Server. Il dfinit une batterie simple mais complte de toutes

    les oprations excutables sur une base de donnes (lecture de donnes, oprations

    dadministration du serveur, ajout, suppression et mises jour dobjets SQL - tables, vues,

    procdures stockes, dclencheurs, types de donnes personnaliss -). Ce langage est compos

    dinstructions, rparties dans de 3 catgories distinctes :

    DML : Data Modification Language, soit langage de manipulation de donnes. Dans cette

    catgorie, sinscrivent les instructions telles que linstruction SELECT ou encore les

    instructions qui nous permettent la cration, la mise jour et la suppression de donnes

    stockes dans les tables de la base de donnes. Il est important de retenir que le DML sert

    simplement pour les donnes, et en aucun cas pour la cration, mise jour ou suppression

    dobjets dans la base de donnes SQL Server.

    DDL : Data Definition Language, soit langage de dfinition de donnes. Les instructions de

    cette catgorie, permettent dadministrer la base de donnes, ainsi que les objets quelle

    contient. Elles ne permettent pas de travailler sur les donnes. Aussi, elles ne seront pas

    traites dans ce chapitre.

    DCL : Data Control Language, soit langage de contrle daccs. Cette catgorie dinstructions

    nous permet de grer les accs (autorisations) aux donnes, aux objets SQL, aux transactions

    et aux configurations gnrales de la base.

    Ces trois catgories combines permettent que le langage T-SQL prenne en compte des

    fonctionnalits algorithmiques, et admette la programmabilit. Le T-SQL est non seulement un

    langage de requtage, mais aussi un vrai langage de programmation part entire. Sa capacit

    crire des procdures stockes et des dclencheurs (Triggers), lui permet dtre utilis dans un

    environnement client de type .NET, au travers dune application en C# ou en VB.NET. Dans ce

    chapitre, nous allons dtailler la partie DML du T-SQL exclusivement. Auparavant, nous tudierons

    diffrents lments syntaxiques qui composeront la syntaxe de ce langage, savoir les expressions,

    les oprateurs et les fonctions. Par la suite, nous traiterons laspect procdural (algorithmique) de ce

    langage.

    2.2 Les expressions Dans le T-SQL, nous pouvons utiliser des expressions, permettant de mettre en uvre

    laspect algorithmique du langage. Les expressions peuvent prendre plusieurs formes.

    - Les constantes : une constante est une variable, dont la valeur ne peut tre change lors de

    lexcution dinstructions T-SQL.

  • Dotnet France Association Grgory CASANOVA / James RAVAILLE

    6 Les bases fondamentales du langage Transact SQL

    - Les noms de colonnes : ils pourront tre utiliss comme expressions. La valeur de

    lexpression tant la valeur stocke dans une colonne pour une ligne donne.

    - Les variables : il sagit dentits qui peuvent tre employes en tant quexpressions ou dans

    des expressions. Les variables sont prfixes par le caractre @. Les variables systmes sont

    prfixes par les caractres @@. La valeur de lexpression variable est la valeur de la variable

    elle-mme.

    - Les fonctions : il est possible dutiliser comme expression nimporte quelle fonction. Elles

    permettent dexcuter des blocs dinstructions T-SQL, et de retourner une valeur.

    - Les expressions boolennes : elles sont destines tester des conditions. Elles sont utilises

    dans des structures algorithmiques de type WHILE, IF ou encore dans la clause WHERE dune

    requte SQL, affiner de permettre dafficher une recherche, ou bien poser une condition

    dexcution.

    - Les sous-requtes : une sous requte SELECT peu tre place en tant quexpression. La

    valeur de lexpression est la valeur renvoye par la requte.

    2.3 Les oprateurs Les oprateurs nous permettent de combiner des expressions, des expressions calcules ou

    des expressions boolennes. Il existe plusieurs types doprateurs, que nous allons dtailler :

    - Les oprateurs arithmtiques :

    + Addition

    - Soustraction

    * Multiplication

    / Division

    % Modulo (reste de division)

    - Les oprateurs de bits :

    & ET

    | OU

    ^ OU exclusif

    ~ NON

    - Les oprateurs de comparaison :

    = gale

    > Suprieur

    >= Suprieur ou gal

    < Infrieur

  • Dotnet France Association Grgory CASANOVA / James RAVAILLE

    7 Les bases fondamentales du langage Transact SQL

    Les bornes minimum et maximum sont incluses

    EXISTS (Sous Requte) Renvoie True, si et seulement si la sous requte renvoie au moins une ligne

    Exp1 LIKE Permet de filtrer des donnes suivant un modle

    Pour loprateur de comparaison LIKE, les expressions permettent de dfinir un modle de

    recherche pour la correspondance des donnes :

    _ Un caractre quelconque

    % N caractres quelconques

    *ab+ Un caractre dans la liste ab

    [a-z] Un caractre dans lintervalle a-z

    *^ab+ Un caractre en dehors de la liste ou de lintervalle spcifi

    ab Le ou les caractres eux-mmes

    - Les oprateurs logiques :

    OR Retourne True si une expression des deux expressions (oprandes) est vraie

    AND Retourne True si les deux expressions (oprandes) sont vraies.

    NOT True si lexpression est fausse.

    2.4 Les fonctions Les fonctions se distinguent en deux catgories : celles cres par lutilisateur, ou les

    fonctions systme. Nous allons dtailler ci-dessous les fonctions systme, les fonctions utilisateur

    seront traites dans un autre cours. Les fonctions systme se divisent en diffrentes catgories :

    - Les fonctions dagrgation :

    COUNT (*) Dnombre les lignes slectionnes

    COUNT ([ALL|DISTINCT] exp1) Dnombre toutes les expressions non nulles ou les expressions non nulles distinctes

    COUNT_BIG Possde le mme fonctionnement que la fonction COUNT, simplement, le type de donnes de sortie est de type bigint au lieu de int

    SUM ([ALL|DISTINCT] exp1) Somme de toutes les expressions non nulles ou des expressions non nulles distinctes

    AVG ([ALL|DISTINCT] exp1) Moyenne de toutes les expressions non nulles ou des expressions non nulles distinctes

    MIN (exp1) OU MAX (exp1) Valeur MIN ou valeur MAX dexp1

    STDEV ([ALL|DISTINCT] exp1) Ecart type de toutes les valeurs de lexpression donne

    STDEVP ([ALL|DISTINCT] exp1) Ecart type de la population pour toutes les valeurs de lexpression donne

    VAR ([ALL|DISTINCT] exp1) Variance de toutes les valeurs de lexpression donne

  • Dotnet France Association Grgory CASANOVA / James RAVAILLE

    8 Les bases fondamentales du langage Transact SQL

    VARP ([ALL|DISTINCT] exp1) Variance de la population pour toutes les valeurs donne

    GROUPING Sutilise avec ROLLUP ou CUBE. Indique 1 quand la ligne est gnre par un ROLLUP ou un CUBE et 0 dans un autre cas

    CHECKSUM (* | *exp1+) Permet de calculer un code de contrle par rapport une ligne de la table ou par rapport une liste dexpression. Cette fonction permet la production dun code de hachage

    CHECKSUM_AGG ([ALL|DISTINCT] exp1) Permet le calcul dune valeur de hachage par rapport un groupe de donnes. Ce code de contrle permet de savoir rapidement si des modifications ont eu lieu sur un groupe de donnes, car cette valeur de contrle nest plus la mme aprs modification des donnes

    - Les fonctions mathmatiques :

    ABS (exp1) Valeur absolue dexp1.

    CEILING (exp1) Plus petit entier suprieur ou gal exp1.

    FLOOR (exp1) Plus grand entier suprieur ou gal exp1.

    SIGN (exp1) Renvoie 1 si exp1 est positive, -1 si elle est ngative, et 0 si elle est gale 0.

    SQRT (exp1) Racine carre dexp1.

    POWER (exp1, n) Exp1 la puissance n.

    SQUARE (exp1) Calcul du carr dexp1.

    - Les fonctions trigonomtriques :

    PI () Valeur de PI.

    DEGREES (exp1) Conversion dexp1 de radian vers degrs.

    RADIANS (exp1) Conversion dexp1 de degrs vers radians.

    SIN (exp1), COS (exp1), TAN (exp1), COT (exp1) Sin, cos ou tangente dexp1.

    ACOS (exp1), ASIN (exp1), ATAN (exp1) Arc cos, arc sin ou arc tan dexp1.

    ATN2 (exp1, exp2) Angle dont la tangente se trouve dans lintervalle exp1 et exp2.

    - Les fonctions logarithmiques :

    EXP (exp1) Exponentielle dexp1.

    LOG (exp1) Logarithme dexp1.

    LOG10 (exp1) Logarithme base 10 dexp1.

    - Les fonctions de dates :

    Format Abrviation signification

    Year Yy, yyyy Anne (1753 9999)

    quarter Qq, q Trimestre (1 4)

    Month Mm, m Mois (1 12)

    Day of year Dy, y Jour de lanne (1 366)

  • Dotnet France Association Grgory CASANOVA / James RAVAILLE

    9 Les bases fondamentales du langage Transact SQL

    Day Dd, d Jour dans le mois (1 31)

    Weekday Dw, ww Jour de la semaine (1 7)

    Hour Hh Heure (0 23)

    Minute Mi, n Minute (0 59)

    Seconds Ss, s Seconde (0 59)

    milliseconds Ms Milliseconde (0 999)

    GETDATE () Date et Heure systme.

    DATENAME (format, exp1) Renvoie la partie date sous forme de texte.

    DATEPART (format, exp1) Renvoie la valeur de la partie date selon le format donn.

    DATEDIFF (format, exp1, exp2) Diffrence entre les deux tables selon le format donn.

    DATEADD (format, p, exp1) Ajoute p format la date exp1.

    DAY (exp1) Retourne le numro du jour dans le mois.

    MONTH (exp1) Retourne le numro du mois.

    YEAR (exp1) Retourne lanne.

    SWITCHOFFSET (datetimeoffset, zone_horaire) Convertis le type datetimeoffset en le type pass en second paramtre.

    SYSDATETIME Retourne la date et lheure usuelle du serveur dans le format datetime2.

    SYSDATETIMEOFFSET Fonctionne de la mme manire que SYSDATETIME, mais il prend en compte le dcalage GMT.

    - Les fonctions de chane de caractres :

    ASCII (exp1) Valeur du code ASCII du premier caractre dexp1.

    UNICODE (exp1) Valeur numrique correspondant au code UNICODE dexp1.

    CHAR (exp1) Caractre correspondant au code ASCII dexp1.

    NCHAR (exp1) Caractre UNICODE correspondant au code numrique dexp1.

    LTRIM (exp1), RTRIM (exp1) Supprime les espaces droit pour RTRIM et gauche pour LTRIM dexp1.

    STR (exp1, n, p) Convertit le nombre exp1, en chaine de longueur maximale n dont p caractres seront droite de la marque dcimale.

    SPACE (n) Renvoie n espaces.

    REPLICATE (exp1, n) Renvoie n fois exp1.

    CHARINDEX (masque, exp1) PATINDEX (%masque%, exp1)

    Renvoie la position de dpart de la premire expression masque dans exp1. PATINDEX permet dutiliser des caractres gnriques et de travailler avec certains type comme TEXT, CHAR ou encore VARCHAR.

    LOWER (exp1), UPPER (exp1) Change la casse. LOWER va convertir exp1 en minuscules et UPPER va convertir exp1 en majuscules.

    REVERSE (exp1) Retourne les caractres dexp1 dans le sens inverse.

  • Dotnet France Association Grgory CASANOVA / James RAVAILLE

    10 Les bases fondamentales du langage Transact SQL

    RIGHT (exp1, n) Renvoie les n caractres les plus droite dexp1.

    LEFT (exp1, n) Renvoie les n caractres les plus gauche dexp1.

    SUBSTRING (exp1, n, p) Renvoie p caractres dexp1 partir de n.

    STUFF (exp1, n, p, exp2) Supprime p caractres dexp1, partir de n, puis insre exp2 la position n.

    SOUNDEX (exp1) Renvoie le code phontique dexp1.

    DIFFERENCE (exp1, exp2) Compare les SOUDEX des deux expressions. La valeur,qui peut tre renvoye va de 1 4,4, valeur pour laquelle, les deux expressions possdent la plus grande similitude.

    LEN (exp1) Retourne le nombre de caractres dexp1.

    QUOTENAME (exp1) Permet de transformer exp1 en identifiant valide pour SQL Server.

    REPLACE (exp1, exp2, exp3) Permet de remplacer dans exp1 toutes les occurrences dexp2 par exp3.

    - Les Fonctions systmes :

    COALESCE (exp1, exp2) Renvoie la premire expression non NULL.

    COL_LENGTH (nom_table, nom_colonne) Longueur de la colonne.

    COL_NAME (id_table, id_colonne) Nom de la colonne.

    DATALENGTH (exp1) Longueur en octet de lexpression.

    DB_ID (Nom_base) Numro didentification de la base de donnes.

    DB_NAME (id_base) Nom de la base.

    GETANSINULL (nom_base) Renvoie 1 si loption ANSI NULL DEFAULT est positionn pour la base.

    HOST_ID () Numro didentification du poste.

    HOST_NAME () Nom du poste.

    IDENT_INCR (nom_table) Valeur de lincrmentation dfinit pour la colonne identit de la table spcifie.

    IDENT_SEED (nom_table) Valeur initiale dfinie pour la colonne identit de la table indique.

    IDENT_CURRENT (nom_table) Retourne la dernire valeur de type identit utilis par cette table.

    INDEX_COL (nom_table, id_index, id_cle) Nom de la colonne index correspondant lindex.

    ISDATE (exp1) Renvoie 1 si lexpression de type varchar possde un format date valide.

    ISNULL (exp1, valeur) Renvoie valeur si exp1 est NULL.

    ISNUMERIC (exp1) Renvoie 1 si lexpression de type varchar a un format numrique valide.

    NULLIF (exp1, exp2) Renvoie NULL si exp1 = exp2.

    OBJECT_ID (objet) Numro didentification de lobjet.

    OBJECT_ID (name) Nom de lobjet dont lid est plac en argument.

    STATS_DATE (id_table, id_index) Date de la dernire mise jour de lindex.

    SUSER_SID (nom_acces) Numro didentification correspondant au nom_acces.

    SUSER_SNAME (id) Nom daccs identifi par lid.

    USER_NAME (id) Nom de lutilisateur dont lid est plac en

  • Dotnet France Association Grgory CASANOVA / James RAVAILLE

    11 Les bases fondamentales du langage Transact SQL

    argument.

    CURRENT_TIMESTAMP Date et heure systme, quivalent GETDATE ().

    SYSTEM_USER Nom daccs.

    CURRENT_USER, USER, SESSION_USER Nom de lutilisateur de la session.

    OBJECT_PROPERTY (id, proprit) Permet de retrouver les proprits de la base.

    ROW_NUMBER Permet de connaitre le numro dune ligne issue dune partition depuis un jeu de rsultats.

    RANK Permet de connaitre le rang dune ligne issue dune partition dans une srie de rsultats.

    DENSE_RANK Fonctionne comme RANK, mais ne sapplique quaux lignes de la srie de rsultat.

    HAS_DBACCESS (nom_base) Permet de savoir si, avec le contexte de scurit actuel, il est possible daccder la base. (retourne 1 dans ce cas, dans le cas contraire, 0)

    HAS_PERMS_BY_NAME Permet de savoir par programmation, si lon dispose dun privilge ou non.

    KILL Cette fonction permet de mettre fin une session utilisateur.

    NEWID () Permet de grer une valeur de type UniqueIdentifier.

    NEWSEQUENTIALID () Permet de grer la prochaine valeur de type UniqueIdentifier.

    PARSENAME (nom_objet, partie__extraire) Permet dextraire partir du nom complet de lobjet, le nom de lobjet. La partie partie__extraire peut prendre la valeur 1, 2, 3, 4 selon si lon veut extraire le nom de lobjet, le schma, la base, ou encore le nom du serveur.

    PUBLISHINGSERVERNAME Permet de savoir qui est lorigine dune publication.

    STUFF (chaine1, n, p, chaine2) Permet de supprimer p caractres de la chaine chaine1, partir des positions n, puis dy insrer chaine2

    - Les fonctions conversion de types :

    CAST (exp1 AS types_donnes) Permet de convertir une valeur dans le type spcifi en argument

    CONVERT (types_donnes, exp1, style) Conversion de lexpression dans le type de donnes spcifi. Un style peut tre spcifi dans le cas dune conversion date ou heure

    - Les fonctions diverses :

    RAND (exp1) Nombre alatoire compris en 0 et 1. Exp1 est la valeur de dpart

    ROUND (exp1, n) Arrondis exp1 n chiffres aprs la virgule

  • Dotnet France Association Grgory CASANOVA / James RAVAILLE

    12 Les bases fondamentales du langage Transact SQL

    3 Les instructions DML

    3.1 Prsentation Pour toutes les instructions du DML, il existe dans SQL Server un outil simple pour retrouver

    la syntaxe voulue rapidement (Pour des instructions simples, telle le SELECT, UPDATE). La dmarche

    est simple. Via le menu contextuel dune table, slectionnez Gnrer un script de la table en tant

    que . Il nous est alors propos de slectionner laction que nous voulons accomplir : SELECT,

    INSERT, UPDATE ou DELETE. Cette action peut aussi tre ralise sur dautres objets SQL de la base

    de donnes.

    3.2 Cration, modification et suppression de donnes

    3.2.1 Linstruction INSERT

    Linstruction INSERT, comme son nom lindique, va nous permettre dajouter une ligne de

    donnes dans une table de la base de donnes. Le code gnrique, dajout dune ligne de donnes

    est la suivante :

    Dans ce code gnrique, nous demandons SQL Server dajouter un enregistrement la

    table Client, appartenant au schma dbo dans la base de donnes Entreprise. Pour prciser les

    colonnes pour lesquelles nous allons ajouter des donnes, il est ncessaire de prciser le nom des

    colonnes, aprs linstruction INSERT INTO. Le mot cl VALUES nous permet de fournir des valeurs

    aux champs. Il est impratif que les valeurs soient dans le mme ordre que celui des colonnes, tout

    dabord pour la cohrence des donnes, mais aussi pour respecter la compatibilit des donnes avec

    le type que vous avez assign votre table au moment de sa cration. Dans le cas o certaines de vos

    colonnes acceptent des valeurs NULL, il existe deux mthodes pour obtenir cette valeur. La premire,

    est domettre le nom de la colonne et la valeur correspondante dans linstruction. La seconde vise

    laisser la colonne dans la description, mais prciser le mot cl NULL dans la clause VALUES. Pour

    des chaines de caractres, il faut placer celles-ci entre simples cotes. Dans le cas dun champ de type

    identit (possdant une incrmentation automatique grce la contrainte IDENTITY), il nest pas

    ncessaire de spcifier ni le nom du champ, ni sa valeur.

    Procdons un exemple pour mieux comprendre :

    INSERT INTO [Entreprise].[dbo].[Client]

    ([Nom_Client]

    ,[Prenom_Client]

    ,[Numero_Client]

    ,[Adresse_Client]

    ,[Mail_Client])

    VALUES

    (

    ,

    ,

    ,

    ,)

    GO

  • Dotnet France Association Grgory CASANOVA / James RAVAILLE

    13 Les bases fondamentales du langage Transact SQL

    Aprs avoir excut le code ci-dessus, le message suivant apparait, confirmant de sa bonne

    excution :

    Dans le cas dune insertion multiple denregistrements, la syntaxe sera la mme,

    lexception prs quau lieu dune seule srie de donnes aprs le mot cl VALUES, vous en spcifier le

    nombre voulu. Si nous voulons ajouter deux enregistrements dans une mme instruction Insert, alors

    la syntaxe est la suivante :

    Le message suivant saffiche, aprs lexcution de cette instruction, ce qui confirme bien que

    lenregistrement multiple a t excut sans erreur :

    INSERT INTO [Client]

    (Nom_Client,

    Prenom_Client,

    Numero_Client,

    Adresse_Client,

    Mail_Client)

    VALUES

    ('CASANOVA',

    'Grgory',

    +33563456764,

    '31 place de la chance',

    '[email protected]'),

    ('RAVAILLE',

    'James',

    +33567876435,

    '34 Avenue de le paix',

    '[email protected]')

    GO

    INSERT INTO [Client]

    (Nom_Client,

    Prenom_Client,

    Numero_Client,

    Adresse_Client,

    Mail_Client)

    VALUES

    ('CASANOVA',

    'Grgory',

    +33563456764,

    '31 place de la chance',

    '[email protected]')

    GO

  • Dotnet France Association Grgory CASANOVA / James RAVAILLE

    14 Les bases fondamentales du langage Transact SQL

    Enfin, il est possible dajouter des enregistrements laide de linstruction SELECT, qui va

    copier les enregistrements dune table (source) vers une autre table (destination). Voici un exemple :

    Dans ce cas, nous allons ajouter dans la table commande, les informations slectionnes. Ici,

    Id_Client, la date du jour grce la fonction GETDATE(), Id_Stock, et le chiffre 1 qui correspond

    la quantit que nous voulons ajouter la commande de notre client. Les informations concernant

    Id_Client et Id_Stock seront slectionnes en fonction des conditions prcises aprs la clause

    WHERE. Grce ce lot, nous allons ajouter la troisime ligne prsente dans le rsultat prsent ci-

    dessous.

    3.2.2 Linstruction UPDATE

    Linstruction UPDATE, permet de mettre jour un ou plusieurs enregistrements. La syntaxe

    gnrique de cette instruction est la suivante :

    Linstruction ci-dessus permet de mettre jour la table Client de la base de donnes

    Entreprise. La clause SET permet dindiquer les champs mettre jour. La clause WHERE, sert cibler

    les enregistrements mettre jour. Voici lenregistrement de la table Client dont le champ Id-Client

    vaut 3 :

    UPDATE [Entreprise].[dbo].[Client]

    SET [Nom_Client] =

    ,[Prenom_Client] =

    ,[Numero_Client] =

    ,[Adresse_Client] =

    ,[Mail_Client] =

    WHERE

    GO

    INSERT Commande

    SELECT Id_Client, GETDATE(), Id_Stock, 1

    FROM Client, Stock

    WHERE Id_Client = 3

    AND Id_Stock = 5

  • Dotnet France Association Grgory CASANOVA / James RAVAILLE

    15 Les bases fondamentales du langage Transact SQL

    Voici une instruction SQL permettant de modifier le nom de ce client :

    Aprs lexcution de linstruction ci-dessus, voici les donnes de lenregistrement modifi :

    Il est aussi possible deffectuer des oprations grce un UPDATE. Par exemple, on peut

    augmenter les prix des articles dun magasin de 10%, en multipliant le prix de tous les articles par 1,1.

    3.2.3 Linstruction DELETE

    Linstruction DELETE permet de supprimer des enregistrements. La syntaxe gnrique est la

    suivante :

    Linstruction DELETE FROM va permettre la suppression de donnes dans la table Client de

    la base de donnes Entreprise, dans la seule condition que les contraintes dans WHERE soient

    respectes. Voici une instruction permettant de supprimer lenregistrement de la table Client dont

    lidentifiant est 4 :

    Aprs avoir excut le code, on remarque que le client dont lidentifiant est 4, nexiste plus :

    La suppression multiple de donnes est possible, par exemple si dans notre cas, nous avions

    prcis une plage didentifiants dans notre clause WHERE.

    DELETE FROM [Entreprise].[dbo].[Client]

    WHERE Id_Client = 4

    GO

    DELETE FROM [Entreprise].[dbo].[Client]

    WHERE

    GO

    UPDATE [Entreprise].[dbo].[Client]

    SET [Adresse_Client] = 18 Rue du cotton

    WHERE Id_Client = 3

    GO

  • Dotnet France Association Grgory CASANOVA / James RAVAILLE

    16 Les bases fondamentales du langage Transact SQL

    3.3 Lire et trier des donnes

    3.3.1 Linstruction SELECT

    Linstruction SELECT permet de slectionner des donnes (tout ou partie

    denregistrements), dune ou plusieurs tables. Elle offre aussi la possibilit de les trier, et de les

    regrouper. La syntaxe gnrale de cette instruction est la suivante :

    Voici une instruction SELECT permettant de lire le nom et ladresse Email de tous les clients

    (si notre but avait t de slectionner toutes les colonnes, au lieu de lister toutes celles-ci, il est

    possible dindiquer que nous les slectionnons toutes avec le simple caractre * ) :

    Le rsultat sera le suivant :

    3.3.2 Changer le nom des colonnes (ALIAS)

    Par dfaut, le nom de la colonne est celui du nom de la colonne dans la table. Il est possible

    den changer en utilisant des alias. Voici un exemple dutilisation dalias :

    SELECT [Nom_Client]

    ,[Mail_Client]

    FROM [Entreprise].[dbo].[Client]

    GO

    SELECT [Id_Client]

    ,[Nom_Client]

    ,[Prenom_Client]

    ,[Numero_Client]

    ,[Adresse_Client]

    ,[Mail_Client]

    FROM [Entreprise].[dbo].[Client]

    GO

  • Dotnet France Association Grgory CASANOVA / James RAVAILLE

    17 Les bases fondamentales du langage Transact SQL

    Le nom des colonnes est chang par un nom plus explicite :

    3.3.3 La condition WHERE

    Il est alors possible dajouter des conditions notre recherche pour laffiner, au travers de la

    clause WHERE. Les restrictions servent limiter le nombre denregistrements slectionner. Les

    conditions contenues dans le WHERE sont des expressions boolennes qui peuvent tre composes

    de noms de colonnes, de constantes, de fonctions, doprateurs de comparaison et doprateurs

    logiques. Prenons un exemple concret :

    Cette instruction SELECT slectionne tous les champs de tous les enregistrements pour

    lesquels la colonne Id_Client est gale soit 1, 2, 3 et 6. On remarque alors que dans notre code,

    nous avons utilis la condition WHERE, une colonne, un oprateur de comparaison et un oprateur

    logique. Le rsultat est le suivant :

    SELECT [Nom_Client] AS 'Nom Client'

    ,[Mail_Client] AS 'Mail Client'

    FROM [Entreprise].[dbo].[Client]

    WHERE Id_Client IN (1,2,3,6)

    GO

    -----

    --Il existe deux manires de renommer les colonnes.

    --Celle-ci :

    -----

    SELECT 'Nom Client' = [Nom_Client]

    ,'Mail Client' = [Mail_Client]

    FROM [Entreprise].[dbo].[Client]

    GO

    -----

    --Ou encore celle l :

    -----

    SELECT [Nom_Client] AS 'Nom Client'

    ,[Mail_Client] AS 'Mail Client'

    FROM [Entreprise].[dbo].[Client]

    GO

  • Dotnet France Association Grgory CASANOVA / James RAVAILLE

    18 Les bases fondamentales du langage Transact SQL

    Linstruction ci-dessus prsente lutilisation des clauses WHERE et BETWEEN, qui permet de

    lire tous les enregistrements dont lidentifiant est compris entre 1 et 10 (bornes incluses). Le rsultat

    est le suivant :

    3.3.4 Les projections de donnes

    Les projections de donnes sont utiles dans certains cas, par exemple lorsque vous voulez

    lister les villes dans lesquelles sont prsents vos clients. Une projection va grouper les

    enregistrements identiques dans un seul et mme enregistrement. Voici les deux cas possibles de

    projection :

    Dans le premier morceau de code, nous allons afficher une seule ligne de chaque rsultat,

    mme si plusieurs rsultats existent pour la colonne Mesure, et nous comptons le nombre

    doccurrence qui interviens pour chaque Mesure, grce la fonction COUNT(), associe la clause

    -----

    -- Deux faons de grouper les colonnes identiques :

    -- Celle-ci :

    -----

    SELECT Mesure, COUNT(Mesure) AS 'Nombre article avec cette mesure'

    FROM Stock

    GROUP BY Mesure

    GO

    -----

    -- Ou celle l :

    -----

    SELECT DISTINCT Mesure

    FROM Stock

    GO

    SELECT [Nom_Client] AS 'Nom Client'

    ,[Mail_Client] AS 'Mail Client'

    FROM [Entreprise].[dbo].[Client]

    WHERE Id_Client BETWEEN 1 AND 10

    GO

  • Dotnet France Association Grgory CASANOVA / James RAVAILLE

    19 Les bases fondamentales du langage Transact SQL

    GROUP BY. Ce genre dinstruction peu tre pratique dans le cas ou lon veut calculer le pourcentage

    de vente en fonction de la localisation dun magasin par exemple. On naffichera quune seule fois la

    localisation du magasin grce la clause GROUP BY, et on affichera pour chaque localisation, le

    nombre de vente effectue. On peut alors facilement en dduire lequel des magasins est le plus

    productif. Pour revenir notre exemple, nous pouvons dduire du rsultat que nous vendons plus

    darticles lunit, que tout le reste des articles.

    Pour le second morceau de code, on pourra seulement afficher les rsultats de faon

    distincte, c'est--dire en vitant les doublons comme dans le premier exemple. En revanche, il ne

    sera pas possible dutiliser une fonction dagrgation, type COUNT(), car elle doit tre contenue

    dans une clause GROUP BY. On obtiendra alors le rsultat identique au premier exemple, hors mis le

    fait que nous ne pouvons pas compter le nombre doccurrence de chaque mesure dans la colonne

    Mesure.

  • Dotnet France Association Grgory CASANOVA / James RAVAILLE

    20 Les bases fondamentales du langage Transact SQL

    3.3.5 Les calculs simples

    Les calculs, comme nous les appelons, regrouperont les calculs numriques mais aussi les

    manipulations sur les chaines de caractres, par exemple la concatnation. Les modles sont les

    suivants :

    Ici, la quantit de chaque Stock sera multiplie par trois dans le rsultat de la recherche par

    linstruction SELECT. Mais la valeur de la quantit de produit ne sera en aucun cas changer dans la

    base de donnes.

    Dans linstruction ci-dessus, nous concatnons les champs Nom_Client et Prenom_Client en

    une seule colonne que nous appellerons NOM COMPLET. Le rsultat est le suivant :

    3.3.6 Le produit cartsien

    Le but du produit cartsien est de croiser des donnes de plusieurs tables, de manire

    obtenir toutes les combinaisons possibles. Il y aura autant denregistrements de retour que le produit

    du nombre de lignes de chaque table. Donnons un exemple :

    SELECT Nom_Client + ' ' + Prenom_Client AS 'NOM COMPLET'

    FROM Client

    SELECT Id_Stock,

    'Quantit Produit' = Quantite * 3

    FROM Stock

  • Dotnet France Association Grgory CASANOVA / James RAVAILLE

    21 Les bases fondamentales du langage Transact SQL

    Le rsultat est le suivant :

    Nous obtenons 20 enregistrements, ce qui est concluent puisque les deux tables contiennent

    respectivement 10 et 2 enregistrements. Les deux syntaxes, ANSI ou classique, retournent bien

    videmment le mme rsultat.

    3.3.7 Les jointures

    Une jointure est un produit cartsien avec une restriction. Une jointure permet dassocier

    logiquement des lignes de tables diffrentes. Les jointures sont gnralement (pour des raisons de

    performances) utilises pour mettre en relation les donnes de lignes comportant une cl trangre

    avec les donnes de lignes comportant une cl primaire. Voyons-le en dtail avec un exemple

    concret :

    -----

    -- Il existe deux manires de faire un produit cartsien :

    -- La syntaxe classique :

    -----

    SELECT Id_Client, Nom_Client, Date_Commande

    FROM Client, Commande

    -----

    -- La syntaxe en SQL ANSI :

    -----

    SELECT Id_Client, Nom_Client, Date_Commande

    FROM Client CROSS JOIN Commande

  • Dotnet France Association Grgory CASANOVA / James RAVAILLE

    22 Les bases fondamentales du langage Transact SQL

    Le rsultat est le suivant et il est le mme pour les deux instructions SQL :

    3.3.7.1 Les jointures externes

    Les jointures externes sont des jointures dans lesquelles la condition est fausse. Dans ce cas,

    le rsultat retourn sera celui dune des deux tables. Le rsultat sera celui de la premire table cite

    si on utilise loption LEFT, et celui de la seconde table cite si lon utilise loption RIGHT. La syntaxe

    est la suivante :

    Et le rsultat est le suivant :

    SELECT Client.Id_Client, Date_Commande

    FROM Client LEFT OUTER JOIN Commande

    ON Client.Id_Client = Commande.Id_Client

    SELECT Client.Id_Client, Date_Commande

    FROM Client RIGHT OUTER JOIN Commande

    ON Client.Id_Client = Commande.Id_Client

    -----

    -- Il existe deux manires de faire une jointure :

    -- La syntaxe classique :

    -----

    SELECT Client.Id_Client, Date_Commande

    FROM Client, Commande

    WHERE Client.Id_Client = Commande.Id_Client

    -----

    -- La syntaxe SQL ANSI :

    -----

    SELECT Client.Id_Client, Date_Commande

    FROM Client INNER JOIN Commande

    ON Client.Id_Client = Commande.Id_Client

  • Dotnet France Association Grgory CASANOVA / James RAVAILLE

    23 Les bases fondamentales du langage Transact SQL

    On remarque alors clairement que suivant quon utilise loption RIGHT ou LEFT, le rsultat

    est diffrent, et quil respecte le comportement dcrit auparavant. Les valeurs NULL prsentes dans

    le premier rsultat sont dues au fait que les clients dont lId est 5 et 6 nont pas de commandes. Ces

    valeurs NULL disparaissent dans le second rsultat, tout simplement parce quil nexiste pas de

    commande qui na pas de client, alors que linverse existe. En revanche, Il est obligatoire dutiliser les

    jointures externes avec la syntaxe ANSI, cest pourquoi je vous recommande dapprendre les

    jointures selon le modle ANSI et non le modle classique, bien que le modle classique soit plus

    logique. Dans les versions antrieures, le modle classique tait support grce aux signes *= et =*,

    mais ceci ne sont plus supports sous SQL Server 2008.

    3.3.8 La close ORDER BY

    La clause ORDER BY est utilise dans une instruction SELECT pour trier les donnes dune

    table (ou plusieurs tables) en fonction dune ou plusieurs colonnes. Par dfaut, le rangement se fera

    par ordre croissant ou par ordre alphabtique. Avec le mot cl ASC, le rangement se fera dans lordre

    ascendant. Avec le mot cl DESC, le rangement se fera dans lordre descendant. Prenons un

    exemple :

    Avec la close ORDER BY, nous obtiendrons le mme rsultat que prcdemment, tri dans

    un ordre diffrent : les enregistrements sont tris selon le champ Nom_Client de faon croissante

    pour le premier lot, de faon dcroissante pour le second lot. Le rsultat est le suivant :

    --Rangement dans l'ordre ascendant :

    SELECT Client.Id_Client,Client.Nom_Client, Date_Commande

    FROM Client LEFT OUTER JOIN Commande

    ON Client.Id_Client = Commande.Id_Client

    ORDER BY Nom_Client ASC

    GO

    --Rangement dans l'ordre descendant :

    SELECT Client.Id_Client,Client.Nom_Client, Date_Commande

    FROM Client LEFT OUTER JOIN Commande

    ON Client.Id_Client = Commande.Id_Client

    ORDER BY Nom_Client DESC

    GO

  • Dotnet France Association Grgory CASANOVA / James RAVAILLE

    24 Les bases fondamentales du langage Transact SQL

    Les enregistrements sont bien rangs dans lordre inverse, suivant la colonne Nom_Client.

    3.3.9 Loprateur UNION

    Loprateur UNION va nous permettre dobtenir un ensemble de ligne provenant de plusieurs

    requtes diffrentes. Toutes les requtes doivent fournir le mme nombre de colonnes avec les

    mmes types de donnes pour chaque colonne (correspondance deux deux).

    Le rsultat est le suivant :

    SELECT Id_Stock, Quantite

    FROM Stock

    UNION

    SELECT Id_Stock, Quantite

    FROM Commande

  • Dotnet France Association Grgory CASANOVA / James RAVAILLE

    25 Les bases fondamentales du langage Transact SQL

    Les rsultats des tables sont associs, et les enregistrements sajoutent. La premire table cite dans

    la premire instruction SELECT sera associe la premire table cite dans la seconde instruction

    SELECT, de mme pour les secondes tables. Dans le rsultat, on obtient alors 2 colonnes au lieu de

    4. Une option est possible avec loprateur UNION, UNION ALL qui va permettre de retourner toutes

    les lignes rsultats, mme celles qui seront en double. Il est bon de savoir que lorsque cet oprateur

    nest pas prcis, les lignes dupliques ne sont retournes quune seule fois.

    3.3.10 Loprateur EXCEPT

    Loprateur EXCEPT permet dextraire dune solution les lments que lon ne veut pas y

    retrouver, c'est--dire, enlever une valeur prcise ou un domaine que lon ne veut pas retrouver dans

    notre solution finale. Il est donc vident que si on exclut des valeurs, les deux expressions SELECT

    spares par le mot cl EXCEPT doivent avoir le mme nombre de colonnes en argument. Prenons

    un exemple :

    Ici, on slectionnera les colonnes Id_Stock et Quantite de la table Stock, except celle pour

    lesquelles lId_Stock est gal 3.

    3.3.11 Loprateur INTERSECT

    Grace cet oprateur, il va tre possible didentifier en une seule requte, des lignes

    dinformations simultanment prsentes dans deux jeux de rsultats distincts, mais de mmes

    structures.

    Le rsultat est le suivant :

    SELECT * FROM Client

    WHERE Id_Client BETWEEN 1 AND 3

    SELECT * FROM Client

    WHERE Prenom_Client = 'Julien'

    SELECT * FROM Client

    WHERE Id_Client BETWEEN 1 AND 3

    INTERSECT

    SELECT * FROM Client

    WHERE Prenom_Client = 'Julien'

    SELECT Id_Stock, Quantite

    FROM Stock

    EXCEPT

    SELECT Id_Stock, Quantite

    FROM Stock

    WHERE Id_Stock = 3

  • Dotnet France Association Grgory CASANOVA / James RAVAILLE

    26 Les bases fondamentales du langage Transact SQL

    Le jeu de donnes obtenu donne tous les clients dont lId est compris entre 1 et 3, et dont le nom est

    Julien. Loprateur INTERSECT, fait lintersection des deux jeux de rsultats, et ne donne en sortie,

    que les valeurs communes aux deux jeux. Dans lexemple donn, les deux jeux de rsultats nont en

    rsultat le client dont lId est 3. Le rsultat final ne donnera donc que le client dont lId est 3, comme

    montr sur lexemple ci-dessus.

    3.3.12 La clause TOP

    La close TOP permet dextraire grce linstruction SELECT, que les premiers

    enregistrements de la slection. Elle est utilisable avec les instructions INSERT, UPDATE, DELETE.

    Prenons un exemple avec linstruction SELECT :

    Cette instruction permet de slectionner les 5 premiers enregistrements de la table Client,

    dans lordre de lecture des enregistrements dans la table. Si nous spcifions la clause ORDER BY,

    alors les enregistrements slectionns respectent cet ordre de tri.

    Cette instruction permet de slectionner 50% des enregistrements dans lordre de lecture

    des enregistrements. Dans le cas ou nous avons utilis un pourcentage, la close WITH TIES ne

    sutilise que si une close ORDER BY est applique au SELECT. Elle a pour effet de ne slectionner les

    enregistrements quaprs la mise en leur tri.

    3.3.13 Crer une table grce SELECT INTO

    Il est possible de crer une table laide de colonnes de tables dj existantes. Grce un

    simple SELECT INTO, nous aurons choisir les colonnes qui constitueront les champs de la nouvelle

    table. Toutes les closes et conditions disponibles pour linstruction SELECT sont applicables pour

    linstruction SELECT INTO. Voici un exemple :

    SELECT TOP 50 PERCENT WITH TIES *

    FROM dbo.Client

    ORDER BY Nom_Client

    SELECT TOP 5 *

    FROM dbo.Client

  • Dotnet France Association Grgory CASANOVA / James RAVAILLE

    27 Les bases fondamentales du langage Transact SQL

    Dans linstruction prcdente, la clause INTO permet de prciser que nous allons crer une

    table, ici, dbo.Exemple, et que nous allons ajouter les lignes trouves dans linstruction SELECT,

    lintrieur de cette nouvelle table. Il est utile de prciser que la table nest pas dfinie en tant que tel

    par la clause INTO, mais plus par le SELECT, car cest cette instruction qui va donner la table ses

    caractristiques (nombre de colonnes, type de donnes des colonnes). Dans le cas o des colonnes

    sont calcules, il est impratif de donner un nom ces colonnes. Si lon fait prcder le nom de la

    table cre par un #, la table sera temporaire locale, si elle est prcde dun ##, elle sera temporaire

    globale. On rappelle que ces deux types de tables temporaires sont stocks dans la base de donnes

    Tempdb qui est une table prdfinie en tant que table systme dans SQL Server 2008. Les tables

    temporaires locales sont accessibles que par la session qui la cre et disparait la dconnexion

    alors que les tables globales, elles sont ensuite accessibles par toutes les sessions, et enfin elles sont

    dtruites lors de la dconnexion de la dernire session lavoir utilise. Ce genre de table est

    pratique, pour des travaux de transferts de donnes, ou encore si nous avons besoin de garder les

    donnes contenues dans une table, tout en voulant supprimer la structure de la table en question.

    3.3.14 La clause COMPUTE et COMPUTE BY

    La clause COMPUTE est utilise la suite de la clause ORDER BY, afin de retourner un sous

    rsultat, en rapport avec le rsultat principal. Le sous rsultat est obligatoirement gnr par une

    fonction dagrgation telle que COUNT, SUM Il est bon de noter que ces clauses sont maintenues

    pour des raisons de compatibilits, mais sont voues disparaitre dans les versions futures.

    Lexemple suivant retourne un rsultat principal, et un sous rsultat. Le rsultat principal slectionne

    toutes les colonnes de la table Client, ordonnes par le nom des clients, tandis que le sous rsultat va

    compter le nombre de client. Lintrt de la clause COMPUTE est de pouvoir gnrer un sous rsultat,

    grce une mme requte.

    Le mot cl BY de la clause COMPUTE, nous permet de retourner les sous rsultats en fonction

    des diffrentes valeurs dune colonne spcifique. Dans lexemple, la suite, on peu remarquer que

    lon donne la quantit du stock, pour chaque Id_Stock en sous rsultat. La colonne que lon prcise

    donc aprs le mot cl BY, nous permet de dire, de quelle manire nous allons dcouper les sous

    rsultats.

    SELECT *

    FROM Entreprise.dbo.Client

    ORDER BY Nom_Client

    COMPUTE COUNT(Id_Client)

    SELECT Id_Client, Nom_Client, Id_Commande

    INTO dbo.Exemple

    FROM dbo.Client, dbo.Commande

    WHERE Client.Id_Client = Commande.Id_Client

  • Dotnet France Association Grgory CASANOVA / James RAVAILLE

    28 Les bases fondamentales du langage Transact SQL

    3.3.15 Les oprateurs ROLLUP et CUBE

    Les oprateurs ROLLUP et CUBE sont utiliss avec la clause GROUP BY, dans le but dobtenir

    des lignes supplmentaires affichant les calculs de la fonction.

    3.3.15.1 Loprateur ROLLUP

    La clause WITH ROLLUP permet de crer des lignes comportant des rsultats pour le groupement

    des colonnes contenues dans la clause GROUP BY, en les combinants de la gauche vers la droite.

    3.3.15.2 Loprateur CUBE

    Loprateur CUBE permet de crer des rsultats pour toutes les combinaisons possibles des colonnes

    contenues dans la clause GROUP BY.

    USE Entreprise

    GO

    SELECT a.Id_Entrepos, b.Id_Stock

    FROM dbo.Entrepos a

    INNER JOIN dbo.Stock b

    ON a.Id_Entrepos = b.Id_Entrepos

    GROUP BY a.Id_Entrepos, b.Id_Stock

    WITH ROLLUP

    SELECT *

    FROM Entreprise.dbo.Stock

    ORDER BY Id_Stock

    COMPUTE SUM(Quantite) BY Id_Stock

  • Dotnet France Association Grgory CASANOVA / James RAVAILLE

    29 Les bases fondamentales du langage Transact SQL

    3.3.16 Loprateur OVER

    Loprateur OVER permet de partitionner les donnes ou encore de les trier avant

    dappliquer une fonction de calcul dagrgat par exemple (Voir les fonctions dans ce chapitre), ou

    encore les fonctions de tri tel que ROW_NUMBER, NTILE, que nous verrons plus tard, ou encore

    DENSE_RANK. Dans le cas dune fonction de tri, loprateur OVER va pouvoir contenir un

    partitionnement ou une clause ORDER BY, ce qui va nous permettre de ranger les donnes avant

    deffectuer une fonction. Il est important de noter que les fonctions dagrgation ne sont applicables

    avec un OVER dans le seul cas dun partitionnement. Prenons un exemple :

    SELECT a.Id_Entrepos, COUNT(b.Id_Stock)

    OVER (PARTITION BY b.Id_Entrepos) AS 'Nombre lments'

    FROM Entrepos a

    INNER JOIN Stock b

    ON a.Id_Entrepos = b.Id_Entrepos

    USE Entreprise

    GO

    SELECT a.Id_Entrepos, b.Id_Stock

    FROM dbo.Entrepos a

    INNER JOIN dbo.Stock b

    ON a.Id_Entrepos = b.Id_Entrepos

    GROUP BY a.Id_Entrepos, b.Id_Stock

    WITH CUBE

  • Dotnet France Association Grgory CASANOVA / James RAVAILLE

    30 Les bases fondamentales du langage Transact SQL

    3.3.17 Loprateur NTILE

    Cette fonction est utilise en addition OVER, et permet de diviser la partition en diffrents

    groupes de donnes quilibres. NTILE sutilise avec une clause ORDER BY de la faon suivante :

    3.3.18 Les sous-requtes

    Il est possible dimbriquer une requte SELECT dans une requte SELECT (UPDATE ou

    DELETE). Les sous requtes peuvent utilises avec les clauses HAVING ou WHERE. Il existe trois types

    de sous requtes diffrentes :

    - Les sous requtes qui ne renvoient quune seule valeur unique (sous-requte scalaire) :

    - Les requtes renvoyant une liste denregistrements. Elles sont utilises avec IN, EXIST, ANY,

    SOME ou encore ALL :

    - La sous requte externe utilise au travers de la clause WHERE, fait rfrence une table de

    la requte interne. Dans ce cas l, la requte externe est excute pour chaque ligne extraite

    de la requte interne.

    3.3.19 Les instructions PIVOT et UNPIVOT

    Ces instructions sont trs puissantes et sont faciles utiliser. Linstruction PIVOT aura la

    capacit de transformer un rsultat prsent sous forme de ligne en colonne et UNPIVOT aura la

    capacit inverse. La clause PIVOT fait partie de la clause FROM de linstruction SELECT. Lutilisation

    de PIVOT va permettre la cration dun pseudo table interne la requte. On pourra donc lui

    assigner un alias avec la clause AS si ncessaire. Le rsultat qui suit est la slection de toutes les

    colonnes de notre table STOCKS. La requte SELECT suivante nous servira de comparaison.

    SELECT Nom_Client

    FROM Motors.dbo.Client

    WHERE EXISTS (SELECT Id_Client_Commande, Id_Client

    FROM Motors.dbo.Commande INNER JOIN Motors.dbo.Client

    ON Id_Client = Id_Client_Commande)

    SELECT *

    FROM Motors.dbo.Client

    WHERE EXISTS(SELECT * FROM Motors.dbo.Client WHERE Id_Client = 4)

    SELECT Id_Client FROM Motors.dbo.Client

    WHERE Id_Client = (SELECT Id_Client FROM Motors.dbo.Client WHERE

    Id_Client = 10)

    SELECT a.Id_Client, Nom_Client, Prenom_Client, Adresse_Client,

    Id_Commande, Date_Commande,

    NTILE(5) OVER (PARTITION BY Nom_Client, Prenom_Client ORDER BY

    Date_Commande) AS 'Ensemble'

    FROM Entreprise.dbo.Client a

    INNER JOIN Entreprise.dbo.Commande b

    ON a.Id_Client = b.Id_Client

  • Dotnet France Association Grgory CASANOVA / James RAVAILLE

    31 Les bases fondamentales du langage Transact SQL

    Voici son rsultat :

    Avec le code qui va suivre, nous allons nous proposer damliorer la lisibilit de notre rsultat

    en affichant, grce un PIVOT, la quantit en fonction des dpts (1, 2, 3 ou 4). Il suffit de faire un

    SELECT des valeurs que nous voulons passer en colonne. Les alias prsents dans lexemple servent

    videmment donner un nom aux colonnes cres, car par dfaut, elles nont pas de noms. Pour

    linstruction PIVOT, comme pour linstruction UNPIVOT, nous allons dans un premier temps

    appliquer une fonction dagrgation la colonne pass en paramtre de la colonne de pivot et la

    colonne par laquelle nous allons effectuer le pivot aprs la clause FOR. La clause IN indiquera

    simplement les valeurs pour lesquelles nous allons effectuer le pivot. Il est important de remarquer

    que lalias que nous donnons au pivot nest pas optionnel. Si vous nen donnez pas, une erreur sera

    leve.

    Le rsultat est le suivant :

    USE Entreprise

    GO

    SELECT Id_Stock,

    [1] AS "D1",[2] AS "D2",[3] AS "D3",[4] AS "D4"

    FROM dbo.Stock

    PIVOT (SUM(Quantite) FOR Id_Entrepos

    IN ([1],[2],[3],[4])) AS PVT

    USE Entreprise

    GO

    SELECT Id_Stock, Id_Entrepos, Quantite

    FROM dbo.Stock

  • Dotnet France Association Grgory CASANOVA / James RAVAILLE

    32 Les bases fondamentales du langage Transact SQL

    3.3.20 Linstruction MERGE

    Linstruction MERGE permet en une action Transact SQL, de modifier, ajouter, ou mme

    supprimer sur une mme table de destination, si la condition est respecte. On pourra alors grce

    une instruction MERGE, modifier des tours tour, chaque ligne de notre table en fonction dune autre

    table. Voici un exemple de structure de linstruction MERGE :

    Description de la requte prcdente : On se propose de modifier la table Stock avec la table

    Commande, avec pour condition darrt, le fait que : Stock.Id_Stock = Commande.Id_Stock.

    Les mots cls WHEN MATCHED THEN vont permettre de dire, si la condition darrt est respecte,

    alors on fait linstruction qui suit le THEN. Ici, on soustraira la quantit du stock, la quantit de la

    commande passe, pour chaque Id_Stock. Il est possible dutiliser les mots cls WHEN NOT MATCHED

    THEN, qui vont nous permettre de modifier les lignes de la table cible pour lesquelles la condition

    darrt nest pas vrai.

    USE Entreprise

    GO

    MERGE INTO dbo.Stock

    USING dbo.Commande

    ON Stock.Id_Stock = Commande.Id_Stock

    WHEN MATCHED THEN

    UPDATE

    SET Stock.Quantite = Stock.Quantite - Commande.Quantite;

  • Dotnet France Association Grgory CASANOVA / James RAVAILLE

    33 Les bases fondamentales du langage Transact SQL

    4 Le SQL Procdural

    4.1 Les variables

    4.1.1 Les variables utilisateur

    Une variable est une zone mmoire caractrise par un type et un nom, et permettant de

    stocker une valeur respectant le type. Dans SQL Server, les variables doivent tre obligatoirement

    dclares avant dtre utilise.

    Voici la dclaration dune variable nomme Id_Client de type Int :

    Linstruction suivante permet de valoriser cette variable via lexcution dune requte

    scalaire :

    4.1.2 Les variables systme

    Les variables systme sont dfinis par le systme et ne peuvent tre disponibles quen lecture.

    Elles se diffrencient syntaxiquement des variables utilisateur par le double @. Lexemple le plus

    courant est la variable @@ERROR, qui est 0 en temps normal, et 1 lorsquune erreur est leve.

    4.2 Les transactions Une transaction est caractrise par le mot lacronyme ACID (Atomic Consistency Isolation

    Durability) :

    - Atomique car la transaction constitue une unit indivisible de travail pour le serveur.

    - Consistance car la fin dune transaction, les donnes montres sont soit celles davant

    transaction (dans le cas dune annulation de la transaction) soit celle daprs transaction

    (dans le cas dune validation).

    - Isolation, car il est possible de verrouiller (isoler) les donnes pendant lexcution de la

    transaction (verrouillage en lecture, en criture, ).

    - Dure car les changements apports sur des donnes par une transaction sont durables (non

    volatiles).

    La syntaxe gnrique dune transaction est la suivante :

    SELECT @IdClient = (SELECT Id_Client FROM Motors.dbo.Client WHERE

    Nom_Client = 'SQL')

    DECLARE @IdClient int

  • Dotnet France Association Grgory CASANOVA / James RAVAILLE

    34 Les bases fondamentales du langage Transact SQL

    Voici un exemple de transaction :

    Ici, dans notre exemple, nous avons deux transactions imbriques. Il est trs important de

    comprendre quune transaction est une unit indissociable, et que par consquent, il est ncessaire

    de terminer par un COMMIT ou ROLLBACK, la dernire transaction en date. La fermeture des

    transactions se fait donc celons un modle LIFO (Last In First Out). La dernire transaction crite sera

    la premire devoir tre ferme. Pour revenir notre exemple, on peu dsormais dire que le nom

    client gal HOLLEBECQ sera chang par VASSELON, du fait du ROLLBACK TRAN qui termine la

    transaction 2, alors que CASANOVA ne sera pas chang par ANDREO, dans transaction1, car celle-ci

    se termine par un ROLLBACK TRAN.

    Note Importante : Les instructions du DML doivent automatiquement comporter un ROLLBACK

    TRAN pour tre prises en compte et tre appliques, alors que les instructions du DDL comportent un

    ROLLBACK TRAN implicite qui est opr juste aprs que linstruction du DDL soit faite. Il faut donc

    faire trs attention la suite dinstructions dans une transaction. Si jamais vous crivez une

    transaction qui comporte deux instruction, une du DML puis une du DDL, mme si vous mettez un

    ROLLBACK la suite, les deux instructions seront COMMIT , puisque les instructions du DDL

    comporte ce ROLLBACK TRAN implicite dont nous avons parl prcdemment.

    4.3 Les lots et les scripts Un lot est une suite de transactions et dinstructions qui seront excutes en un seul et unique bloc.

    Un lot se termine par linstruction GO. Lintrt des lots rside dans les performances. Il faut bien

    entendu prendre en compte quune simple erreur de syntaxe fera que tout votre lot ne sexcutera

    pas. En revanche, les lots possdent certaines restrictions :

    BEGIN TRAN Transaction1

    UPDATE dbo.Client

    SET Nom_Client = 'ANDREO'

    WHERE Nom_Client = 'CASANOVA'

    BEGIN TRAN Transaction2

    UPDATE dbo.Client

    SET Nom_Client = 'VASSELON'

    WHERE Nom_Client = 'HOLLEBECQ'

    COMMIT TRAN Transaction2

    ROLLBACK TRAN Transaction1

    BEGIN TRAN nom_transaction

    --Dmarrage de la transaction

    COMMIT TRAN nom_transaction

    --Validation de la transaction

    SAVE TRAN nom_point_de_retour

    --Dclaration d'un point de contrle de la transaction

    ROLLBACK TRAN nom_transaction OR nom_point_de_controle

    --Annulation de la transaction

  • Dotnet France Association Grgory CASANOVA / James RAVAILLE

    35 Les bases fondamentales du langage Transact SQL

    - Il est impossible dutiliser deux des instructions suivantes, ensembles dans un mme lot :

    CREATE PROCEDURE, CREATE RULE, CREATE DEFAULT, CREATE TRIGGER, CREATE VIEW.

    - Il nest pas possible dagir sur des dfinitions de colonnes ou dagir sur une modification

    opre dans un mme lot.

    - Il nest pas possible de supprimer et de recrer un mme objet dans un mme lot.

    Un script est un ensemble de lots, qui peut tre enregistr dans un fichier dont lextension est

    .sql. Comme exemple de script, vous avez le fichier CoursSqlServer.sql, disponible en annexe de ce

    cours, qui contient la structure de la base, des tables, certaines entres de donnes et certains objets

    de la base tels quune procdure stocke ou un dclencheur

    4.4 Le contrle de flux Il existe quatre faons de contrles les flux sur SQL Server 2008. Les instructions RETURN,

    PRINT, CASE et les blocs BEGINEND, dans lesquels peuvent tre contenus les structures de test IF

    et les boucles WHILE. Toutes ces instructions vont vous permettre de mettre en valeur vos donnes

    en les rendant plus prsentables, ou bien, elles vous permettront de les manipuler avec plus de

    facilit, par exemple pour des actions rptitives, ou des actions ncessitant une condition. Dans

    cette partie, nous allons dtailler tous les contrles de flux possibles.

    4.4.1 Linstruction RETURN

    Linstruction RETURN vous permet de sortir dune instruction ou dune procdure sans

    condition particulire, en renvoyant ou non une valeur entire.

    4.4.2 Linstruction PRINT

    Linstruction PRINT est linstruction daffichage de message. Prenons un exemple :

    Lors de lexcution, les traces suivantes sont affiches dans la fentre Messages :

    PRINT 'NOUS AVONS LE DROIT DE MARQUER'

    PRINT 'CE QUE NOUS VOULONS !'

    PRINT 'ON VEUT AFFICHER LE NOMBRE DE CLIENTS DANS LA TABLE CLIENT ?'

    DECLARE @Variable int

    SELECT @Variable = COUNT(*) FROM Motors.dbo.Client

    PRINT 'LE NOMBRE DE CLIENTS EST :'

    PRINT @Variable

    CREATE PROC Procedure1

    AS

    DECLARE @Variable int = 4

    IF (@Variable > 2)

    RETURN 0;

    ELSE

    RETURN 1;

    GO

  • Dotnet France Association Grgory CASANOVA / James RAVAILLE

    36 Les bases fondamentales du langage Transact SQL

    4.4.3 Linstruction CASE

    Linstruction CASE, permet dattribuer des valeurs en fonction dune condition. Voici un

    exemple :

    Avec un case, on peu crer simplement une colonne en donnant des conditions pour les

    rsultats, en fonction dune autre colonne existante. Par exemple, ici, on dtermine suivant

    lId_Client, si le client est Ancien, Pas si vieux, Rcent, ou si lon ne sait pas.

    Son rsultat dexcution est le suivant :

    4.4.4 Les blocs BEGIN END

    Les blocs dlimitent une srie dinstructions, et ils peuvent tre utiliss avec les conditions IF

    et les boucles WHILE. La structure gnrique est la suivante :

    BEGIN

    --Les blocs peuvent contenir

    --Des instructions ou bien d'autres blocs

    END

    USE Entreprise

    SELECT 'Anciennete' = CASE Id_Client

    WHEN '3' THEN 'ANCIEN'

    WHEN '2' THEN 'PAS SI VIEUX'

    WHEN '1' THEN 'RECENT'

    ELSE 'ON SAIT PAS TROP'

    END,

    Id_Client, Nom_Client

    FROM dbo.Client

    ORDER BY Anciennete

  • Dotnet France Association Grgory CASANOVA / James RAVAILLE

    37 Les bases fondamentales du langage Transact SQL

    4.4.4.1 La condition IF

    La structure de condition IF permet de poser une condition une instruction. Si la condition

    est vraie, linstruction sera excute. Dans le cas contraire, elle ne le sera pas. Voici un exemple

    dutilisation de cette instruction :

    Dans ce script, on dclare dans un premier temps une variable @Variable de type int, et de valeur 1. On applique alors une condition IF, qui dfinit que sil existe un client avec un Id gal la valeur de notre variable dclare pralablement, on le supprime et on crit que le client bien t supprim. Linstruction ELSE dfinit en revanche que pour tous les autres cas, on crit que le client nexiste pas.

    Le rsultat est le suivant dans le cas ou le client lId 1 existe :

    Dans longlet Messages du rsultat de la requte, le message suivant est alors apparu :

    (14 ligne(s) affecte(s))

    (1 ligne(s) affecte(s))

    Le Client 11 a bien t supprim !

    (13 ligne(s) affecte(s))

    Le rsultat est le suivant lorsque le client lId 1 nexiste pas ou plus :

    SELECT * FROM Client

    DECLARE @Variable int = 1

    IF EXISTS (SELECT * FROM Client WHERE Id_Client = @Variable)

    BEGIN

    DELETE FROM Client WHERE Id_Client = @Variable

    PRINT 'Le Client 11 a bien t supprim !'

    END

    ELSE

    PRINT 'Pas de Client pour cet Id !'

    SELECT * FROM Client

  • Dotnet France Association Grgory CASANOVA / James RAVAILLE

    38 Les bases fondamentales du langage Transact SQL

    Dans longlet message de la partie rsultat, on obtient le message suivant :

    (13 ligne(s) affecte(s))

    Pas de Client pour cet Id !

    (13 ligne(s) affecte(s))

    4.4.4.2 La boucle WHILE

    Linstruction WHILE est une structure algorithmique permettant dexcuter un bloc

    dinstructions de manire rptitive, en fonction dune condition. Tant que la condition est vraie, ce

    bloc dinstructions sera excut. Dans la syntaxe de la structure WHILE, deux instructions sont

    connaitre : linstruction BREAK et linstruction CONTINUE. La premire permet de sortir de la

    structure en interrompant son excution. La seconde nous permet de relancer immdiatement

    lexcution du bloc dinstruction. Voici un exemple :

    Cet exemple permet dajouter des clients afin que la table Client en contienne 6.

    4.5 La gestion des curseurs Dans SQL Server, un curseur est un objet qui nous permet dexcuter un traitement sur un

    ensemble denregistrements. Les curseurs sont des outils trs puissants, mais aussi trs gourmands

    en ce qui concerne les ressources. Il est donc conseill de modifier des lignes de rsultat de manire

    traditionnelle, avec un simple UPDATE ou une autre instruction du DML, afin de consommer le moins

    de ressources possibles.

    WHILE (SELECT COUNT(*) FROM Client) < 6

    BEGIN

    INSERT INTO [Entreprise].[dbo].[Client]

    ([Nom_Client]

    ,[Prenom_Client]

    ,[Numero_Client]

    ,[Adresse_Client]

    ,[Mail_Client])

    VALUES

    ('DORDOLO',

    'Mathieu',

    33678765342,

    '9 Avenue des Peupliers',

    '[email protected]')

    END

  • Dotnet France Association Grgory CASANOVA / James RAVAILLE

    39 Les bases fondamentales du langage Transact SQL

    Voici la dclaration dun curseur :

    Argument1 peut tre :

    - INTENSITIVE: seules les oprations sur la ligne suivante sont permises.

    - SCROLL: les dplacements dans les lignes du curseur peuvent se faire dans tous les sens.

    - LOCAL : la porte du curseur est locale au lot, c'est--dire quil peut tre utilis que dans le

    lot dit.

    - GLOBAL : la port du curseur est globale, c'est--dire valable pour toute la connexion.

    - FORWARD_ONLY : les donnes sont extraites du curseur dans leur ordre dapparition.

    - STATIC : une copie des donnes est faite de faon temporaire dans la base tempdb afin que

    le curseur ne soit pas affect par les modifications qui peuvent tre faites sur la base.

    - SCROLL_LOCKS: garantit le succs des instructions DELETE et UPDATE.

    - TYPE_WARNING: permet denvoyer un message WARNING si des conversions de types

    implicites sont effectues.

    - KEYSET: les lignes et leur ordre dans le curseur sont fixs au moment de louverture du

    curseur. Les rfrences de chacune de ces lignes sont conserves dans tempb.

    - DYNAMIC: le curseur reprsente exactement les donnes prsentes dans la base. Donc le

    nombre de ligne, les valeurs quelles contiennent ou encore leur ordre peuvent changer de

    faon dynamique.

    - FAST_FORWARD: permet de dfinir le curseur comme tant en avant et en lecture seule.

    - READ_ONLY: est en lecture seule.

    Argument2 peut tre :

    - UPDATE: Prcise que des mises jour vont tre faites sur la table dorigine du curseur.

    - READ ONLY: Prcise quon se place en lecture seule.

    OPEN

    Cette instruction permet de rendre le curseur utilisable, et crer des tables temporaires

    associes. La variable systme @@CURSOR_ROWS est valorise aprs cette instruction. Sa valeur

    passe de 0 1 aprs linstruction OPEN.

    Sa syntaxe est la suivante :

    Argument1 peut tre :

    - GLOBAL : la port du curseur est globale, c'est--dire valable pour toute la connexion.

    FETCH

    OPEN (arguments1) curseur_auteurs

    DECLARE Curseur (arguments1) CURSOR

    FOR SELECT

    FOR (arguments2) OF liste_de_colonnes

  • Dotnet France Association Grgory CASANOVA / James RAVAILLE

    40 Les bases fondamentales du langage Transact SQL

    Cest linstruction qui permet dextraire une ligne du curseur et de valoriser les variables et

    leur contenu. Aprs cette instruction, la variable systme @@FETCH_STATUS est 0, si toutefois le

    FETCH cest bien pass.

    Argument1 peut tre :

    - NEXT: Lit la ligne suivante. Cest la seule option possible pour un INSENSITIVE CURSOR.

    - PRIOR: Lit la ligne prcdente.

    - FIRST: Lit la premire ligne.

    - LAST: Lit la dernire ligne.

    - ABSOLUTE p: Lit la Pime ligne de lensemble.

    - RELATIVE p: Lit la Pime ligne partir de la ligne courante.

    CLOSE

    Cette instruction permet la fermeture du curseur et la libration de la place mmoire o il

    t contenu. Il est important de faire intervenir cette opration ds que possible dans le souci de

    librer les ressources.

    DEALLOCATE

    Cette instruction permet de supprimer le curseur et les ressources associes.

    Maintenant que nous avons expliqu la structure et le fonctionnement dun curseur, nous

    allons montrer un exemple concret afin de comprendre leur fonctionnement en pratique :

    DECLARE @Id_Client INT

    DECLARE curseur CURSOR FOR

    SELECT Id_Client FROM Client

    OPEN curseur

    FETCH curseur INTO @Id_Client

    WHILE @@FETCH_STATUS = 0

    BEGIN

    PRINT @Id_Client

    FETCH curseur INTO @Id_Client

    END

    CLOSE curseur

    DEALLOCATE curseur

    DEALLOCATE Nom_Curseur

    CLOSE Nom_Curseur

    FETCH (arguments1) (FROM GLOBAL) Nom_Curseur INTO Liste_Variable

  • Dotnet France Association Grgory CASANOVA / James RAVAILLE

    41 Les bases fondamentales du langage Transact SQL

    Dans ce cas l, le curseur va nous permettre grce une boucle WHILE, de parcourir tous les

    Id_Client pour lesquels @@FETCH_STATUS sera gal 0. Cette variable peu prendre trois tats,

    0, -1, -2, respectivement pour dire que soit linstruction FETCH cest droul normalement et a russi,

    soit pour dire que linstruction a choue, sinon pour dire que la ligne recherche est manquante. En

    temps normal, cette variable systme est initialise -1. Aprs avoir parcouru tous les

    enregistrements de la table client, il est ncessaire de fermer le curseur et de le d allouer. Le

    rsultat est le suivant pour notre base de donnes dexemple, Entreprise.

    4.6 Les exceptions

    4.6.1 Lever une exception

    Pour chaque erreur qui survient dans SQL Server, SQL Server produit un message derreur. En

    rgle gnrale, tous les messages possdent la mme structure : un numro derreur, un message

    dexplication de lerreur, un indicateur de svrit, un tat, le nom de la procdure associe

    lerreur et le numro de la ligne ayant provoque lerreur. La gravit est un indicateur, un chiffre de 0

    24 (gravit croissante). Il est possible de lever des exceptions personnalises via linstruction

    RAISERROR :

    Lorsquon veut lever une erreur, on peu soit donner lidentifiant de lerreur en question, soit

    lui donner un message particulier. Si on lui donne un message particulier comme nous lavons fait

    dans lexemple ci-dessus, il faut automatiquement lui prciser une gravit et un tat. On peut ajouter

    une clause WITH la suite de linstruction RAISERROR, pour appliquer une des trois options

    possibles :

    - LOG : le message sera consign dans lobservateur dvnement Windows.

    - NOWAIT : le message sera dlivr sans attente lutilisateur.

    - SETERROR : permet de valoriser @@ERROR et ERROR_NUMBER avec le numro du message

    derreur.

    On peut aussi dfinir un message derreur par la procdure stocke sp_addmessage et le

    supprimer par la procdure stocke sp_dropmessage. Voici la syntaxe de cration dun message

    derreur :

    exec sp_addmessage @msgnum, @severity,

    @msgtext, @lang, @with_log, @replace

    RAISERROR ('Le stock est ngatif !', 12, 1)

  • Dotnet France Association Grgory CASANOVA / James RAVAILLE

    42 Les bases fondamentales du langage Transact SQL

    Dans lordre, les paramtres correspondent aux donnes suivantes : identifiant, svrit,

    message, langue, log et replace. Les paramtres Log et Replace ne sont pas obligatoires. Replace sert

    remplacer le message derreur dune erreur existante. En revanche, pour connaitre le code de la

    langue utiliser, utilisez la procdure stocke sp_helplanguage.

    4.6.2 Gestion des erreurs dans le code

    Il existe deux manires de grer les erreurs. La premire consiste tester la valeur de la

    variable systme @@ERROR, la seconde consiste positionner dans un gestionnaire dexception TRY

    le bloc dinstructions tester, et dans le CATCH, lerreur lever. Voyons la syntaxe :

    Les instructions TRY CATCH ne peuvent tre dissocies.

    Le bloc TRY permet de regrouper ensemble toutes les instructions susceptibles de lever une

    erreur. SI le cas se prsente ou une instruction lve une erreur dans le bloc TRY, le contrle est

    directement donn la premire instruction du bloc CATCH.

    Le bloc CATCH suit toujours le bloc TRY. Celui-ci est excut si et seulement si, lexcution

    dune instruction du bloc TRY lve une erreur. Dans le bloc CATCH, le code permet de grer lerreur

    leve. Pour obtenir des informations sur cette dernire, il est possible dutiliser les fonctions SQL

    suivantes :

    - ERROR_MESSAGE() : Retourne le texte du message communiquer lapplication. Ce texte

    comprend tous les paramtres mis en argument lerreur en question.

    - ERROR_NUMBER() : Retourne le numro de lerreur.

    - ERROR_SEVERITY() : Retourne le niveau de gravit.

    - ERROR_STATE() : Retourne ltat.

    BEGIN TRY

    -- ...

    END TRY

    BEGIN CATCH

    -- ...

    END CATCH

  • Dotnet France Association Grgory CASANOVA / James RAVAILLE

    43 Les bases fondamentales du langage Transact SQL

    5 Conclusion Dans ce chapitre, nous avons donc vu la majorit des instructions possible en T-SQL DML,

    avec chaque fois un exemple dexplication. Il est bon de rpter que ce chapitre ne dtaille pas les

    deux autres facettes du Transact SQL qui sont le DDL et le DCL, tout simplement car on peu assimiler

    le DCL ladministration de SQL Server, et parce que nous voyons le DDL au fur et mesure que nous

    apprenons crer les diffrents objets de la base dans SQL Server. Dans le chapitre suivant nous

    verrons de quelle manire il est possible de crer et grer deux nouveaux objets de la base de

    donnes : les vues et les index.