Академический Документы
Профессиональный Документы
Культура Документы
com
www.supinfo.com
2 / 61
2.1.3.
2.1.4.
2.1.5.
2.1.6.
2.1.7.
2.1.8.
2.1.9.
3.2.3.
3.2.4.
3.2.5.
3.2.6.
3.2.7.
3.2.8.
Conclusion .......................................................................................................................................... 22
4.1.3.
4.1.4.
4.1.5.
4.1.6.
http://www.labo-dotnet.com
Ce document est la proprit de SUPINFO et est soumis aux rgles de droits dauteurs
3 / 61
Types de donnes................................................................................................................................. 36
5.4.3.
5.4.4.
http://www.labo-dotnet.com
Ce document est la proprit de SUPINFO et est soumis aux rgles de droits dauteurs
4 / 61
Performant : SQL Server se classe parmi les SGBDR les plus rapides
(www.microsoft.com/sql/worldrecord).
Evolutif et fiable : vous pouvez rpartir la charge sur plusieurs serveurs, bnficier des
avantages des systmes multi-processeurs (SMP Sysmetric Multi Processing) et profiter des
performances de Windows 2000 DataCenter Server qui supporte 32 processeurs et 64 GO de
ram).
Rapidit de mise en uvre : avec SQL Server, le dveloppement, le dploiement et
ladministration dapplications destines au Web sont acclrs grce aux nombreuses
fonctionnalits ddies, ainsi quau support du Web.
Pour dcouvrir les fonctionnalits de SQL Server, rendez vous cette adresse :
http://www.microsoft.com/france/sql/decouvrez/fonction.asp qui vous prsentera chacune des
fonctionnalits.
http://www.labo-dotnet.com
Ce document est la proprit de SUPINFO et est soumis aux rgles de droits dauteurs
5 / 61
Installation du serveur
Je vais prsenter ici comment installer la version dveloppeur de SQL Server car la principale
cible de ce document sont les dveloppeurs. Linstallation dune autre version ne change que peu,
lexception de la version Desktop (MSDE) qui est prvu pour tre automatise et redistribue. Les
versions PocketPC sortent galement du cadre de ce chapitre du fait de la spcificit de la plateforme.
Dans ces cas, reportez vous aux documentations spcifiques de chaque version.
2.1.1.
Configuration requise
2.1.2.
Voici le menu apparaissant aprs insr le CDRom SQL Server Developer Edition :
http://www.labo-dotnet.com
Ce document est la proprit de SUPINFO et est soumis aux rgles de droits dauteurs
6 / 61
Si ce menu napparat pas lors de linsertion de votre CDRom ou si vous lancez linstallation depuis
un lecteur rseau ou une autre source, vous pouvez lancez manuellement linstallation en excutant le
fichier autorun.exe ou setup.bat pour sauter ltape 1.
Observons maintenant ce menu. Voici maintenant les 5 options proposes :
Composants de SQL Server 2000
o Cest loption pour installer le serveur SQL en lui-mme et/ou les composants et
outils additionnels.
Composants requis pour SQL Server 2000
o Si vous tes sous Windows 95, vous pouvez mettre niveau votre systme
dexploitation pour supporter les outils clients de SQL Server.
Aide sur linstallation et la mise niveau
o Ouvre le fichier daide de SQL Server dans laquelle vous trouverez entre autre les
dtails de linstallation du serveur.
Consulter les notes de mise jour
o Corrections apportes au manuel qui nont pas pu tre incluses dans le fichier daide
original
Visitez notre site Web
o Renvoie
lutilisateur
sur
le
site
web
de
SQL
Server :
http://www.microsoft.com/france/sql/default.asp si vous installez la version franaise
de SQL Server.
Loption qui nous intresse est la premire : Composants de SQL Server 2000.
2.1.3.
7 / 61
English Query : Cet outil vous permet de formuler vos requtes en anglais.
Installons le serveur. Vous pourrez relancer le menu du CDRom plus tard pour installer les deux outils
supplmentaires.
2.1.4.
Cliquez sur suivant sur la premire page. Vous arrivez alors cet cran :
http://www.labo-dotnet.com
Ce document est la proprit de SUPINFO et est soumis aux rgles de droits dauteurs
8 / 61
2.1.5.
9 / 61
Server et Outils clients : En plus dinstaller les outils clients, on installe par le biais de cette
option le serveur SQL.
Connectivit uniquement : Ninstalle que des composants et des bibliothques daccs.
Choisissons dinstaller le serveur SQL et les outils clients en cochant la deuxime option.
Il faut maintenant choisir une instance installer :
SQL Server permet davoir sur la mme machine plusieurs instances . Cela signifie que sur une
machine quelconque vous pouvez avoir deux ou plus serveurs SQL en simultan. Chacun deux ayant
alors ses propres bases de donnes, et sa propre ruche (une ruche est une clef racine de la base de
registre dans laquelle sont stockes toutes les options du serveur SQL). Les instances sont
diffrencies par un nom attribu chacune delle. Il est toutefois rare davoir besoin dinstaller
plusieurs instances sur une mme machine.
Linstance par dfaut est linstance recherche sur la machine lorsque aucune instance nest spcifie.
Si vous installez SQL Server sur une machine sur laquelle il nest pas install et si vous ne prvoyez
pas dinstaller dautres instances sur la machine, gardez loption Par dfaut coche. Il sera alors
plus simple daccder cette base depuis les autres programmes.
Si vous installez une nouvelle instance sur la machine, spcifiez alors un autre nom pour linstance.
Supposons que cest linstance par dfaut que nous installons et cliquons sur suivant .
2.1.6.
http://www.labo-dotnet.com
Ce document est la proprit de SUPINFO et est soumis aux rgles de droits dauteurs
10 / 61
2.1.7.
Si vous avez choisi dinstaller le serveur avec les options par dfaut vous devriez arriver lcran
suivant (vous aurez dabord choisi les options dinstallation si vous avez cliqu sur Personnalis ) :
http://www.labo-dotnet.com
Ce document est la proprit de SUPINFO et est soumis aux rgles de droits dauteurs
11 / 61
Vous devez spcifiez le compte utilis pour faire fonctionner le serveur SQL.
Choisissez tout dabord si vous utiliserez les mmes informations pour chaque service ou si
vous spcifierez sparment ces informations. A de rare exceptions prs, vous pouvez utilisez
le mme compte pour tous les services.
Choisissez alors un compte dexcution de service. Le serveur SQL utilisera alors le compte
spcifi pour sexcuter. Il requit donc des droits administrateurs sur la machine, et mme les
droits dadministrateur du domaine si vous utilisez un cluster de serveurs.
o Utiliser le compte systme local , cette option est intressante si vous nutilisez
quun seul serveur SQL, ou si vous lutilisez des fins de tests. En effet, le compte
systme local na pas accs aux fonctionnalits rseaux de Windows 2000 et ne
pourra donc pas communiquer avec dventuels autres serveurs SQL.
o Utiliser un compte dutilisateur de domaine , spcifiez ici un utilisateur ayant les
droits dadministrateur (ou administrateur du domaine si vous utilisez un cluster). Il
peut tre intressant de crer un utilisateur spcifique ayant des droits limits (comme
refuser louverture de session par exemple) afin de pouvoir isoler le compte SQL et
dtecter plus facilement la source dun ventuel piratage. Vous pouvez spcifier soit
un utilisateur local, soit un utilisateur du domaine si vous souhaitez utiliser le mme
compte pour tous vos serveurs. Dans tous les cas, il faut que vous spcifiiez le mot de
passe du compte.
Loption dmarrage automatique du service nest disponible que si vous avez choisi de
configurer sparment chaque service. Vous pourrez toujours modifier les options du serveur
aprs linstallation pour changer ce paramtre.
o Cochez la case pour que le service ce lance automatiquement lors du dmarrage de la
machine.
Validez en cliquant sur suivant.
2.1.8.
http://www.labo-dotnet.com
Ce document est la proprit de SUPINFO et est soumis aux rgles de droits dauteurs
12 / 61
2.1.9.
http://www.labo-dotnet.com
Ce document est la proprit de SUPINFO et est soumis aux rgles de droits dauteurs
13 / 61
http://www.labo-dotnet.com
Ce document est la proprit de SUPINFO et est soumis aux rgles de droits dauteurs
14 / 61
Service Manager
Si vous avez install Service Manager (inclus dans les options dinstallation par dfaut), une nouvelle
icne sera apparue dans la barre des taches :
http://www.labo-dotnet.com
Ce document est la proprit de SUPINFO et est soumis aux rgles de droits dauteurs
3.2.
15 / 61
Enterprise Manager
Enterprise Manager est le couteau suisse de ladministrateur et du dveloppeur SQL Server. En effet,
depuis cet outil vous pouvez accder toutes les options et fonctionnalit du serveur et de toutes les
bases ( condition den avoir le droit bien sr !). Il se prsente sous la forme dune console enfichable
MMC dont voici un aperu :
Comme vous pouvez le constater sur cette image, Enterprise Manager vous permet de manipuler
depuis la mme fentre plusieurs serveurs en mme temps. Ces serveurs peuvent tre regroups en
groupes ou sous groupes pour faciliter la gestion dimportants parcs de machines. Les fonctionnalits
sont regroupes par nud dans un sous-arbre unique chaque instance de serveur :
Bases de donnes : permet daccder aux bases de donnes, et leur contenu
Data Transformation Services : service de transfert et de transformation des donnes
Gestion : utilitaire pour la gestion courante et la surveillance
Rplication : permet de lier les serveurs entre eux pour rpliquer les donnes, en tant que
distributeur ou en tant quabonn
Scurit : gestion des accs au serveur
Services Support : gestion des transactions distribues et configuration de lenvoi de mails
depuis SQL Server
Meta Data Services : Permet dutiliser un serveur de mta-donnes.
3.2.1.
Pour ajouter un serveur administrer, rien de plus simple. Cliquez droit sur le groupe de serveur dans
lequel vous voulez rajouter le serveur et faites Enregister un nouveau serveur . Vous pouvez
galement crer un nouveau groupe de serveurs en cliquant droit sur Serveurs Microsoft SQL ou
sur un groupe dj existant si vous souhaitez mettre le nouveau groupe dans un groupe existant.
Enregistrement dun nouveau serveur :
La premire page rsume les diffrentes actions que vous devrez effectuer. On vous propose ensuite la
liste des serveurs trouvs sur le rseau :
http://www.labo-dotnet.com
Ce document est la proprit de SUPINFO et est soumis aux rgles de droits dauteurs
16 / 61
Choisissez ici le(s) les serveur(s) rajouter, puis cliquez sur Ajouter pour les mettre dans la liste
des serveurs ajouter. Cliquez sur suivant.
Spcifiez ici si vous utiliserez votre compte Windows ou un compte SQL. Utilisez la premire option
de prfrence, car vous naurez aucune information de login fournir. Vous devez toutefois tre sur le
mme domaine que le serveur (ou en local) pour bnficier de cette option.
Si vous choisissez la deuxime option, il faudra spcifier un compte utilisateur SQL ayant le droit de
se connecter, ou de demander chaque connexion un login et un mot de passe :
http://www.labo-dotnet.com
Ce document est la proprit de SUPINFO et est soumis aux rgles de droits dauteurs
17 / 61
Dans tous les cas de figure, on vous demande dans quel groupe mettre ce serveur, soit un existant, soit
on vous propose den crer un nouveau.
Aprs validation, une fentre vous indiquera le succs ou lchec de lenregistrement du serveur.
3.2.2.
Configurer le serveur
Pour accder aux options de configuration du serveur, faites un clic droit sur le nom du serveur puis
choisissez options. Remarquez au passage le menu conceptuel du serveur dans lequel vous avez accs
certaines tches courantes comme larrt/dmarrage du service, limport/export de donnes, etc.
Les options se prsentent sous la forme dune fentre plusieurs onglets :
http://www.labo-dotnet.com
Ce document est la proprit de SUPINFO et est soumis aux rgles de droits dauteurs
18 / 61
Vous devez alors spcifier un nom de base de donne, ici Base de test , un nom de classement
(langue de la base de donne, la valeur par dfaut tant celle du serveur) et les fichiers de donne et de
transactions, ainsi que leurs proprits :
http://www.labo-dotnet.com
Ce document est la proprit de SUPINFO et est soumis aux rgles de droits dauteurs
19 / 61
Pour les deux types de fichier, vous pouvez spcifier le comportement de lexpansion des fichiers.
Vous pouvez en effet dfinir de quelle faon les fichiers de donnes vont augmenter de taille (pas
pas ou en pourcentage), une taille maximale et les fichiers dans lesquels les donnes vont tre
rparties. Plus de dtails dans laide fournie avec SQL Server.
3.2.4.
Pour crer une table, cliquez droit sur le nud tables de la base de donnes sur laquelle vous
voulez crer la table.
Pour modifier une table existante, cliquez droit sur la table existante et fates Modifier la table .
Dans les deux cas, vous devez arriver un cran comme celui-ci :
Depuis cette fentre, vous pouvez spcifier crer/modifier/supprimer une colonne la table, en
spcifiant le type de donne, la longueur, le droit dy mettre NULL, etc.
Vous avez galement un certain nombre dicnes pour grer les clefs, les index, les triggers, etc.
Pour appliquer les modifications ou enregistrer la nouvelle table, cliquez sur la disquette et la table
sera enregistre. Si vous modifiez une table existante, il vaut veiller lintgrit des donnes et il se
peut que vous ne soyez pas autoris modifier la table si des donnes existent dj.
3.2.5.
Enterprise Manager propose un diteur de diagramme dans lequel vous pouvez afficher les tables et
leurs relations. Depuis ce diagramme, vous pouvez modifier le modle de donne directement :
http://www.labo-dotnet.com
Ce document est la proprit de SUPINFO et est soumis aux rgles de droits dauteurs
20 / 61
Toutefois, je recommande plutt lutilisation de Visio pour les personnes ayant ce logiciel. En effet
Visio permet de modliser les bases de donnes dun point de vue dtach du serveur, et possde de
nombreux outils tels que la gnration de rapports que SQL Server ne propose pas.
3.2.6.
http://www.labo-dotnet.com
Ce document est la proprit de SUPINFO et est soumis aux rgles de droits dauteurs
21 / 61
Vous pouvez trs facilement crer des vues depuis cet cran en spcifiant les tables utiliser, les
champs afficher et les relations entre les tables.
3.2.7.
Le dveloppement de procdure stocke est facilit par Enterprise Manager. Vous pouvez soit crer
une procdure stocke, soit en modifier une existante depuis le nud Procdures stockes :
http://www.labo-dotnet.com
Ce document est la proprit de SUPINFO et est soumis aux rgles de droits dauteurs
22 / 61
3.2.8.
Conclusion
Enterprise Manager est le plus complet des outils permettant dadministrer SQL Serveur. Vous pouvez
galement visualiser/modifier/supprimer des donnes, mais il est souvent plus intressant de passer par
une application pour cela. Pour les environnements o vous navez pas Enterprise Manager, sachez
que toutes les commandes sont disponibles en T-SQL pour configurer et administrer le serveur.
3.3.
Analyseur de requtes
Lanalyseur de requtes est un client SQL Server destin lexcution de requtes. De plus, il vous
permet dafficher le plan dexcution, dafficher des informations de traage et dafficher des
statistiques. Vous pouvez ainsi optimiser les requtes en identifiant les goulots dtranglement.
Tout comme Enterprise Manager, vous pouvez soit spcifier un compte SQL, soit utiliser le compte
Windows.
Ouverture de lanalyseur de requte :
Depuis cette fentre vous devez spcifier des informations de connexion valides, quelles soient du
type authentification Windows (cest donc lutilisateur en cours sur la machine qui va transmettre sont
authentification) ou du type SQL Server (des comptes spcifiques SQL). Un bouton parcourir vous
montrera la liste des serveurs disponibles sur le rseau, le . tant le serveur local. Attention
toutefois, un administrateur peut cacher pour des raisons de scurit la dcouverte de son serveur par
ce biais.
http://www.labo-dotnet.com
Ce document est la proprit de SUPINFO et est soumis aux rgles de droits dauteurs
23 / 61
Une fois connect, vous avez votre disposition une fentre dans laquelle vous pourrez entrez vos
requtes :
Cet outil tant MDI (Multiple Documents Interface Interface documents multiples), vous pouvez
ouvrir plusieurs de ces fentres depuis le menu fichier. Nouveau pour ouvrir une nouvelle fentre
utilisant la mme connexion, Connecter pour ouvrir une nouvelle connexion.
Remarquez le volet gauche qui vous permet dexplorer le serveur, avec, en premier les bases de
donnes, puis les objets communs (fonctions, types de donnes, etc.) et des modles dans un second
onglet du volet qui vous aidera la rdaction de requtes courantes.
Notez galement le menu droulant de la barre doutil dans lequel il est affich la base de donne en
cours pour la fentre ayant le focus.
Entrez donc une requte quelconque dans la fentre et cliquez soit sur la flche bleu de la barre
doutils, soit appuyez sur F5 pour excuter la requte.
La requte que jemploie ici est :
SELECT * FROM Products
Vous pouvez afficher les rsultats de deux manires. Cliquez sur le bouton droulant pour choisir entre
le mode texte ou le mode grille, ou encore dans un fichier :
http://www.labo-dotnet.com
Ce document est la proprit de SUPINFO et est soumis aux rgles de droits dauteurs
24 / 61
Le plan dexcution vous permet dafficher quelles parties des requtes sont les plus lourdes.
Slectionnez de lafficher depuis ce mme menu et excutez la requte.
Un nouvel onglet sera apparu :
Vous pouvez depuis cet onglet afficher le cot de chaque tape de la requte. Ici, il ny a qune tape
donc lintrt est limit, mais pour les requtes importantes, cela permet disoler les charges lourdes.
De plus, depuis lanalyseur de requtes, vous pouvez grer les index de la table en cours depuis le
menu Fichier -> Grer les index .
http://www.labo-dotnet.com
Ce document est la proprit de SUPINFO et est soumis aux rgles de droits dauteurs
25 / 61
Tches de post-installations
4.1.1.
Lancement du serveur
Si vous venez dinstaller le serveur SQL et que vous navez pas redmarr, il faudra lancer
manuellement le serveur. Si vous avez redmarr et moins que vous ayez spcifi le contraire lors de
linstallation, le serveur sera lanc.
Si ce nest pas le cas, vous avez plusieurs possibilits pour lancer le serveur :
Utilisez le Gestionnaire de service (Service Manager). Pour plus de dtails, rfrez vous au
chapitre 3.1 concernant Service Manager.
Utilisez le composant enfichable Services depuis une console MMC et dmarrez le service
MSSQLSERVER
Utilisez Enterprise Manager (qui est en fait galement un composant enfichable dans une
console MMC). Enterprise Manager est loutil idal pour ladministrateur du serveur SQL. Je
prsente plus en dtail loutil au chapitre 3.2.
4.1.2.
Configurations diverses
Utilisez Enterprise Manger pour configurer les options de votre serveur. Vous pouvez galement
utiliser des commandes Transact SQL pour modifier la plupart des options. Il est toutefois plus ais
dutiliser Enterprise Manager. Reportez vous la documentation si vous souhaitez tout de mme
utiliser le Transact SQL.
Lancez Enterprise Manager. Selon que vous souhaitiez administrer un serveur install localement ou
un serveur install sur une autre machine, vous devrez ou non enregistrer un serveur. Reportez vous la
prsentation de Enterprise manager pour plus de dtails.
http://www.labo-dotnet.com
Ce document est la proprit de SUPINFO et est soumis aux rgles de droits dauteurs
26 / 61
Si vous avez install localement SQL Server, vous aurez votre instance du serveur dj enregistre.
Vous pouvez donc cliquer avec le bouton droit sur linstance et slectionner proprits pour
accder aux options du serveur.
SQL Server install sur une autre machine
Si vous avez install SQL Serveur sur une autre machine, vous devrez renseigner le serveur. Pour se
faire cliquez droit sur Groupe SQL Server et faite Enregistrez un nouveau serveur SQL . Suivez
alors les indications de lassistant. Pour plus dinformation, reportez vous la prsentation de
Enterprise Manager.
Une fois le serveur enregistr, vous pouvez cliquer avec le bouton droit sur linstance et slectionner
proprits pour accder aux options du serveur.
Options de configuration du serveur
Les diffrents onglets regroupent les options par catgories. Pour des dtails spcifiques chaque
options, reportez vous la documentation, mais voici un bref descriptif de chaque onglets :
Gnral :
o Cet onglet vous donne des informations systmes propos du serveur SQL.
http://www.labo-dotnet.com
Ce document est la proprit de SUPINFO et est soumis aux rgles de droits dauteurs
27 / 61
Vous pouvez galement configurer les paramtres de dmarrage des services ainsi que
la ligne de commande de dmarrage, ainsi que les diffrents moyens de connexion au
serveur.
Mmoire :
o Vous pouvez configurer ici loccupation mmoire du serveur.
o Par exemple, vous pouvez allouer une certaine quantit de mmoire vive rserve au
serveur, et indiquer des paramtres spcifiques de gestion mmoire pour optimiser les
performances du serveur (au dtriment des autres applications souvent)
Processeur :
o Pour les ordinateurs ayant plusieurs processeurs, vous pouvez ddier au serveur SQL
un ou plusieurs processeurs, et configurer diverses options de priorit du serveur SQL.
Scurit :
o Prcisez dans cet onglet le mode dauthentification et le compte de service de SQL
Server.
Connexions :
o Cet onglet permet de configurer les connections au serveur.
Paramtres du serveur :
o Prcisez depuis cet onglet la langue par dfaut du serveur, certains paramtres de
scurit ainsi que lutilisation de mails depuis le serveur.
Paramtre de base de donnes :
o Cest ici que vous spcifiez des options de maintenance et dadministration, telles que
les rpertoires de cration de base de donne, des options de sauvegarde, etc.
Rplication :
o Configurer ici si le serveur est capable de rpliquer une base de donnes.
Active Directory :
o Vous pouvez enregistrer votre serveur dans une base Active Directory.
o
4.1.3.
Comme nous lavons vu dans la prsentation de SQL Server, il est possible de rcuprer des donnes
directement au format XML depuis SQL Serveur. Pour cela, il faut que IIS soit install.
Lancement de lassistant
Explorer larborescence jusquau site Web accueillant la gnration de flux XML depuis SQL Server.
Cliquez droit sur le site Web et faites Nouveau -> Rpertoire virtuel .
http://www.labo-dotnet.com
Ce document est la proprit de SUPINFO et est soumis aux rgles de droits dauteurs
28 / 61
Spcifiez le nom du rpertoire virtuel. Pour cet exemple, nous utiliserons la base de donne
Northwind qui est une base de donne exemple installe avec SQL Server.
Mettons alors, comme le suggre lassistant :
http://monserveur/Northwind o nomserveur est le nom de la machine.
Spcifier galement un chemin ou stocker ces fichiers. Faites attention aux droits des rpertoires.
http://www.labo-dotnet.com
Ce document est la proprit de SUPINFO et est soumis aux rgles de droits dauteurs
29 / 61
Spcifiez dans cet onglet des informations de connexion valides. Pour notre exemple, choisissons la
deuxime option utiliser lauthentification intgre de Windows . Vous aurez tout loisir daffiner
ses options lorsque vous utiliserez vos propres bases de donnes.
Onglet Source de donnes
Cet onglet permet de choisir le serveur SQL. Si le serveur Web est situ sur une autre machine vous
pourrez alors choisir le bon serveur SQL.
Choisissez galement la bonne base de donnes. Pour notre exemple, choisissons Northwind.
Onglet Paramtres
Spcifiez depuis cet onglet comment les utilisateurs peuvent accder au contenu. Pour lexemple,
cochez tout. Vous devrez ensuite spcifier uniquement les options dont vous aurez besoin pour viter
des commandes dangereuses.
Onglet Noms virtuels
Configurez depuis cet onglet des schmas de requtes. Cette notion tant assez complexe, je vous
conseille dtudier la documentation de SQL Server avant de configurer cet onglet.
Pour lexemple, cliquez sur Nouveau . Dans la boite dialogue alors ouverte, choisissez un nom
virtuel. Prenons templates (ou ce que vous voulez) pour lexemple. Slectionnez template
comme type de nom virtuel et choisissez le chemin daccs : D:\SQLXML\Northwind\templates
(qui doit exister !!!).
Procdez de mme pour crer un nom virtuel pour les schmas : cliquez sur Nouveau , puis mettez
schemas (ou ce que vous voulez) dans le nom virtuel, schema pour le type et
D:\SQLXML\Northwind\schemas pour le chemin daccs, qui, bien sr, doit exister.
Enfin, cliquez nouveau sur Nouveau puis mettez dbobjects dans le nom virtuel (ou ce que
vous voulez) et en type choisissez dbobject . Vous navez pas besoin ici de spcifier un chemin.
Onglet Avanc
Cet onglet contient dautres paramtres spcifiques que nous laissons tels quels.
4.1.4.
Pour tester le rpertoire virtuel cre, tapez la chane suivante dans le navigateur :
http://monserveur/northwind?sql=SELECT * FROM Employees FOR XML AUTO&root=root et
appuyez sur ENTRE.
Si vous ne voyez rien, affichez la source de la page. Vous verrez alors le rsultat des donnes au
format XML.
Reportez vous la documentation pour personnaliser le flux XML de sortie. Il suffit alors prs depuis
nimporte quelle application capable de rcuprer des donnes au format XML pour aprs les traiter.
4.1.5.
Il est beaucoup plus intressant dutiliser un template que de spcifier la requte directement dans
lurl.
Crez ce fichier XML dans votre rpertoire templates (d:\SQLXML\Northwind\templates) :
http://www.labo-dotnet.com
Ce document est la proprit de SUPINFO et est soumis aux rgles de droits dauteurs
30 / 61
Comme vous pouvez le voir, vous avez rcupr le rsultat sous forme XML. Vous pouvez dj
imaginer lavantage dune telle technique. Par exemple, on utilisant le support de XML, nimporte
quelle application capable deffectuer une requte http de rcuprer des donnes. Pas besoin de crer
une connexion avec le serveur SQL ! De plus, XML tant standard, on pourra accder ces donnes
depuis nimporte quelle plateforme possdant un parseur XML.
http://www.labo-dotnet.com
Ce document est la proprit de SUPINFO et est soumis aux rgles de droits dauteurs
31 / 61
Le flux tant au format XML, rien ne nous empche dy associer une feuille de style.
La preuve par lexemple :
Utilisons cette fois ci ce template :
<?xml version="1.0" encoding="ISO-8859-1" ?>
<ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql" sql:xsl='products.xsl'>
<sql:query>
SELECT ProductID, ProductName, CategoryID FROM Products FOR XML AUTO
</sql:query>
</ROOT>
Puis copiez cette feuille de style dans le mme rpertoire en lappelant products.xsl :
<?xml version='1.0' encoding='UTF-8' ?>
<xsl:stylesheet
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="1.0">
<xsl:template match='Products'>
<tr>
<td>
<xsl:value-of select='@ProductID' />
</td>
<td>
<xsl:value-of select='@ProductName' />
</td>
<td>
<xsl:value-of select='@CategoryID' />
</td>
</tr>
</xsl:template>
<xsl:template match='/'>
<html>
<body>
<table border='1'>
<tr>
<th colspan='3'>SQLXML test avec
XSL</th>
</tr>
<tr>
<th>ID du produit</th>
<th>Nom du produit</th>
<th>ID de la catgorie du produit</th>
</tr>
<xsl:apply-templates select='ROOT' />
</table>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
http://www.labo-dotnet.com
Ce document est la proprit de SUPINFO et est soumis aux rgles de droits dauteurs
32 / 61
Figure 33 - Rsultat d'affichage d'un requte SQLXML associe une feuille de style
Vous pouvez voir alors que la feuille de style a transform le flux XML en HTML. Le
?contenttype=text/html indique au navigateur que le rsultat est au format HTML, et non XML
comme lextension le laisse supposer.
Les possibilits de SQL XML sont immenses, on peut passer des paramtres par lurl, utiliser XPath
pour parcourir un document et mme y mettre des scripts clients. Il est donc possible de raliser des
applications Web compltes sans avoir une seule ligne de code standard (C#, VB, PHP ou autre)
taper.
Pour aller plus loin, je vous invite consulter la documentation fournie avec SQL Server.
http://www.labo-dotnet.com
Ce document est la proprit de SUPINFO et est soumis aux rgles de droits dauteurs
33 / 61
Le Transact SQL, ou T-SQL est un langage ddi laccs aux donnes. Il est une extension de SQL
et propose de nombreuses amliorations, compar ce dernier :
Structures de contrle (if/then/switch/)
Dclaration de variables
Curseurs (pointeurs de donnes)
Et bien dautres encore
Ce langage est une extension de la norme SQL-92.
5.2.
Northwind
Pour les exemples qui vont suivre, jutiliserai lanalyseur de requtes, mais vous pouvez trs bien
utiliser nimporte quel logiciel permettant lexcution de requtes. Nous utiliserons la base de donne
Northwind qui est livr en exemple avec SQL Server. Voici les tables de cette base :
http://www.labo-dotnet.com
Ce document est la proprit de SUPINFO et est soumis aux rgles de droits dauteurs
34 / 61
http://www.labo-dotnet.com
Ce document est la proprit de SUPINFO et est soumis aux rgles de droits dauteurs
5.3.
35 / 61
Commentaires
Il existe deux faons de mettre des commentaires dans une requte T - SQL :
-- Commentaire
Nous verrons plus loin quoi correspondent les diffrentes instructions, cet exemple permettant juste
de montrer la syntaxe des commentaires.
5.4.
Variables
5.4.1.
Dclaration
Sans les variables, le T-SQL ne serait quune implmentation du SQL standard. Vous pouvez dclarer
des variables de nimporte quel type SQL Server.
Exemple :
DECLARE @MyInteger int
http://www.labo-dotnet.com
Ce document est la proprit de SUPINFO et est soumis aux rgles de droits dauteurs
5.4.2.
36 / 61
Types de donnes
Nous verrons plus tard que nous pouvons crer nos propres types de donne.
http://www.labo-dotnet.com
Ce document est la proprit de SUPINFO et est soumis aux rgles de droits dauteurs
37 / 61
A quoi sert le n devant les types de chanes de caractres ? Il correspond en fait aux types utilisant
les caractres Unicode. Ces types permettent dutiliser les caractres spciaux lis aux langues (les
accents, etc.). On peut toutefois utiliser des caractres spciaux, si on est sur le mme jeu de caractre
que le serveur, mais il est peu recommand de partir du principe que le serveur le restera (mise jour,
changement de configuration, de logiciel, etc.). Utilisez donc les n-types lorsque vous risquez
davoir des caractres spciaux. Toutefois, les n-types utilisent deux fois plus de place (les
caractres tant cods sur 16 bits au lieu de 8 comme avec les caractres normaux ), il faut donc
bien tudier le modle de donnes avant de faire le choix.
Les types variables (varchar, nvarchar, varbinary) permettent de limiter le gaspillage de place en
ne stockant que les donnes effectives. Par exemple, dclarer un char(20) prendra systmatiquement
20 octets en mmoire, alors que dclarer un varchar(20) ne prendra que la taille relle de la valeur
spcifie.
5.4.3.
Pour pouvoir utiliser une variable, il faut dabords quelle ait t dclare.
Vous pourrez ensuite laffecter de deux manires, et rcuprer sa valeur trs simplement.
Excutez la requte ci-dessus, en vrifiant que vous tes bien sur la base de donnes Northwind .
DECLARE @AvgUnitPrice money
SELECT @AvgUnitPrice = AVG(UnitPrice)
FROM Products
SELECT @AvgUnitPrice
Sortie :
28.8663
Sortie :
77
La diffrence avec lexemple prcdent est que cette fois ci nous utilisons le mot SET au lieu de
SELECT pour affecter la variable. Il faut bien faire attention avec SET au type de donne et au
nombre de champs retourns qui doit tre un. A loppos, avec SELECT, il faut faire attention car si
on renvoie plusieurs lignes, la valeur affecte sera celle de la dernire ligne affecte.
On peut galement affecter plusieurs variables en une fois avec SELECT, tandis quavec SET on ne
peut pas :
http://www.labo-dotnet.com
Ce document est la proprit de SUPINFO et est soumis aux rgles de droits dauteurs
38 / 61
@AvgUnitPrice = AVG(UnitPrice),
@ProductCount = COUNT(ProductID)
FROM Products
SELECT @AvgUnitPrice, @ProductCount
Sortie :
28.8663
77
Vous voyez ici comment affecter deux variables avec un seul SELECT, ainsi que comment en afficher
plusieurs, toujours avec SELECT.
5.4.4.
Vous pouvez crer vos propres types de donnes. Par exemple, pour reprsenter un code postal, on
utilise couramment varchar(5) comme type de donne.
Nous allons donc crer un type de donne ZipCode pour mapper ce type.
EXEC sp_addtype @typename='ZipCode', @phystype='varchar(5)'
Il faut utiliser les types de donnes utilisateur avec prcaution, car si lon modifie le type, toutes les
donnes de toutes les tables de ce type risquent de ne pas pouvoir tre converties.
5.5.
IF / ELSE
Avec T-SQL vous pouvez crire des routines de test avec IF et ELSE
Exemple :
DECLARE @ProductCount int
SET @ProductCount = (SELECT COUNT(ProductID) FROM Products)
IF (@ProductCount > 100)
PRINT 'Plus de 100 rfrences'
ELSE
PRINT 'Moins de 100 rfrences'
Sortie, mais attention, la commande PRINT transmet des messages. Si vous utilisez un logiciel qui va
afficher sous forme de grille les rsultats, vous ne verrez rien. Utilisez par exemple lanalyseur de
requte et affichez les rsultats sous forme de texte.
http://www.labo-dotnet.com
Ce document est la proprit de SUPINFO et est soumis aux rgles de droits dauteurs
39 / 61
Le mot clef IF attend une expression boolenne. Vous pouvez utiliser les oprateurs de comparaison
courants (=, >, <, >=, <=, <>, != , !<, !>) et utiliser les combinaisons logiques (AND, ALL, ANY,
BETWEEN, EXISTS, IN, LIKE, NOT, OR, SOME). Voyez la MSDN pour plus de dtails concernant
les oprateurs.
Le bloc ELSE est optionnel, et vous pouvez imbriquer autant de IF que vous le souhaitez. Si lun des
blocs faits plus dune ligne, imbriquez les lignes dans un block BEGIN END. Exemple :
DECLARE @ProductCount int
SET @ProductCount = (SELECT COUNT(ProductID) FROM Products)
IF (@ProductCount
BEGIN
PRINT
PRINT
END
ELSE
BEGIN
PRINT
PRINT
END
> 100)
'Plus de 100 rfrences'
@ProductCount
Il aura fallu mettre ici entre un BEGIN END les lignes, sinon il y aurait eu une erreur. Notez au
passage que lon peut afficher directement une variable avec PRINT, si la conversion en nvarchar est
possible.
Autre exemple :
DECLARE @ProductCount int
SET @ProductCount = (SELECT COUNT(ProductID) FROM Products)
IF (@ProductCount < 100)
BEGIN
PRINT 'Plus de 100 rfrences'
PRINT @ProductCount
DECLARE @MaxPrice money
SELECT @MaxPrice = MAX(UnitPrice)
FROM Products
PRINT 'Le prix maximum est de ' +
CONVERT(nvarchar(10),@MaxPrice) +
' '
END
ELSE
BEGIN
PRINT 'Moins de 100 rfrences'
PRINT @ProductCount
END
Sortie :
Plus de 100 rfrences
77
http://www.labo-dotnet.com
Ce document est la proprit de SUPINFO et est soumis aux rgles de droits dauteurs
40 / 61
Cet exemple est un peu plus complexe que lexemple prcdent. Observez tout dabord que lon peut
dclarer une variable dans un bloc BEGIN END, et que cette variable ne sera disponible que dans le
bloc o elle a t dclare.
Observez galement que pour pouvoir afficher une variable, il faut parfois la convertir, en fonction de
sont type. Ici, le type money nest pas affichable directement, cest pourquoi il faut utiliser CONVERT
en spcifiant le type de sortie et lentre (variable ou colonne). On concatne ensuite les chanes avec
les + .
5.6.
WHILE
Vous pouvez utiliser la structure WHILE dans une requte T-SQL. Le principe est le mme que le
while du C, C++, C#, ou la plupart des autres langages, c'est--dire que tant que lexpression value
est vraie, on excute la boucle, sinon, on quitte le WHILE.
Exemple :
DECLARE @index int
SET @index = 0
WHILE @index < 10
BEGIN
PRINT 'Index=' + CONVERT(varchar(2),@index)
SET @index = @index + 1
END
Sortie :
Index=0
Index=1
Index=2
Index=3
Index=4
Index=5
Index=6
Index=7
Index=8
Index=9
Vous voyez donc que la boucle affiche le contenu de la variable, puis lincrmente. La boucle sera
ritre si lexpression value est vraie, ici, lindex devant tre infrieur 10.
Vous pouvez galement utiliser CONTINUE et BREAK pour influencer sur le comportement de la
boucle.
http://www.labo-dotnet.com
Ce document est la proprit de SUPINFO et est soumis aux rgles de droits dauteurs
41 / 61
Par exemple :
DECLARE @index int
SET @index = 0
WHILE @index < 10
BEGIN
PRINT ''
PRINT 'Index=' + CONVERT(varchar(2),@index)
SET @index = @index + 1
IF @index = 7
BEGIN
PRINT 'Le nombre 7 fait quitter le while'
BREAK
END
IF (@index -1) % 3 = 0
BEGIN
PRINT 'On passe la prochaine itration'
CONTINUE
END
PRINT 'Le nombre n''est pas un multiple de 3'
END
Sortie :
Index=0
On passe la prochaine itration
Index=1
Le nombre n'est pas un multiple de 3
Index=2
Le nombre n'est pas un multiple de 3
Index=3
On passe la prochaine itration
Index=4
Le nombre n'est pas un multiple de 3
Index=5
Le nombre n'est pas un multiple de 3
Index=6
Le nombre 7 fait quitter le while
Explications :
A chaque passage dans la boucle WHILE, on va afficher la variable @index, puis lincrmenter. La
nouveaut de cet exemple est que dans chaque itration, on teste si @index est gal 7. Dans ce cas,
on quitte le WHILE avec BREAK. On teste galement si le nombre est un multiple de 3. Si cest le
cas, on passe la prochaine itration avec CONTINUE. Si aucun de ces tests nest vrifi, on excute
http://www.labo-dotnet.com
Ce document est la proprit de SUPINFO et est soumis aux rgles de droits dauteurs
42 / 61
la fin du WHILE qui consiste simplement ici prvenir lutilisateur que lindex en cours nest pas un
multiple de 3.
Observez galement que pour afficher une , il faut la doubler, pour indiquer que ce nest pas la
fin de la chane de caractre, mais une apostrophe. Cest le mme principe quen C et drivs o il faut
doubler le \ pour lafficher.
5.7.
GOTO / LABEL
Cette structure permet de dclarer des tiquettes et de sauter ces dernires. Cette structure tant peu
utilise, je ne ferai que donner un exemple simple :
DECLARE @index int
SET @index = 0
debut:
PRINT 'Index=' + CONVERT(varchar(2),@index)
SET @index = @index + 1
IF @index != 10
GOTO debut
Sortie :
Index=0
Index=1
Index=2
Index=3
Index=4
Index=5
Index=6
Index=7
Index=8
Index=9
Explications :
Le mot clef GOTO, change le flux dexcution pour indiquer au moteur SQL de passer ligne dfinie
par une tiquette. On utilise le : pour marquer une tiquette.
5.8.
CASE (simple)
http://www.labo-dotnet.com
Ce document est la proprit de SUPINFO et est soumis aux rgles de droits dauteurs
10 THEN
24 THEN
42 THEN
68 THEN
'aucun'
43 / 61
'dix'
'vingt quatre'
'quarante deux'
'soixante huit'
END
PRINT 'Le nombre est ' + @anyString
Sortie :
Le nombre est quarante deux
Explications :
La structure CASE retourne la valeur spcifie aprs le THEN lorsque lexpression spcifie est gale
la valeur donne avec WHEN.
Si aucune valeur nest trouve, on utilise alors celle spcifi avec ELSE. La clause ELSE tant
obligatoire.
Attention aux types, utilisez au besoin les fonctions de convertion.
http://www.labo-dotnet.com
Ce document est la proprit de SUPINFO et est soumis aux rgles de droits dauteurs
5.9.
44 / 61
CASE (recherche)
La deuxime variante du CASE consiste ne pas fournir dexpression comparer. Il faudra alors
fournir chaque WHEN une expression boolenne qui sera value. Si cette dernire est vrifie, alors
lexpression retourne sera celle du THEN correspondant.
Modifions notre prcdent exemple :
DECLARE @anyNumber int, @anyString nvarchar(20)
SET @anyNumber = 42
SELECT @anyString =
CASE
WHEN @anyNumber < 20
WHEN @anyNumber < 40
WHEN @anyNumber < 60
WHEN @anyNumber < 80
ELSE 'trs grand !'
END
THEN
THEN
THEN
THEN
'infrieur
'infrieur
'infrieur
'infrieur
vingt'
quarante'
soixante'
quatre-vingt'
Sortie :
Le nombre est infrieur soixante
Dans cette variante du CASE, on value une une chacune des expressions fournies aux WHEN,
jusqu en trouver une qui soit vraie. Dans ce cas, on retourne lexpression fournie avec le THEN
correspondant.
5.10.
Intgration de SQL
Dans les exemples prcdents, nous nutilisions que des variables locales. Vous pouvez bien sr
utiliser le SQL standard pour traiter les donnes.
Exemple avec un IF :
SELECT
UnitPrice,
CASE WHEN UnitPrice < 30 THEN 'pas cher'
WHEN UnitPrice < 60 THEN 'moyen cher'
ELSE 'trs cher'
END AS Comment
FROM Products
Comment
---------pas cher
pas cher
pas cher
moyen cher
http://www.labo-dotnet.com
Ce document est la proprit de SUPINFO et est soumis aux rgles de droits dauteurs
45 / 61
trs cher
pas cher
De la mme faon, on peut utiliser des variables dans des requtes INSERT, UPDATE, etc. Cest trs
utile pour les procdures stockes car vous pouvez utiliser les arguments de la procdure stocke. Plus
de dtails lors du chapitre sur les procdures stockes.
Exemple :
DECLARE @NewPrice money
DECLARE @ProductID int
SET @NewPrice = 4.5
SET @ProductID = 5
-- Affichage des donnes actuelles
SELECT ProductID, ProductName, Unitprice
FROM Products
-- Mise jour des donnes
UPDATE Products
SET UnitPrice = @NewPrice
WHERE ProductID = @ProductID
-- Affichage des donnes mises jour
SELECT ProductID, ProductName, Unitprice
FROM Products
Sortie (tronque):
ProductID
----------1
2
3
4
5
6
ProductName
---------------------------------------Chai
Chang
Aniseed Syrup
Chef Anton's Cajun Seasoning
Chef Anton's Gumbo Mix
Grandma's Boysenberry Spread
UnitPrice
--------------------18.0000
19.0000
10.0000
22.0000
18.5000
25.0000
.......................
76
77
Lakkalikri
Original Frankfurter grne Soe
18.0000
13.0000
ProductName
---------------------------------------Chai
Chang
Aniseed Syrup
Chef Anton's Cajun Seasoning
Chef Anton's Gumbo Mix
Grandma's Boysenberry Spread
UnitPrice
--------------------18.0000
19.0000
10.0000
22.0000
4.5000
25.0000
http://www.labo-dotnet.com
Ce document est la proprit de SUPINFO et est soumis aux rgles de droits dauteurs
46 / 61
.......................
76
77
Lakkalikri
Original Frankfurter grne Soe
18.0000
13.0000
Explications :
Cest un exemple simple dans lequel sont mixs lutilisation de variables et lutilisation de requtes
SQL.
5.11.
Procdures stockes
5.11.1.
Les procdures stockes peuvent sapparenter des fonctions du cot serveur. En effet, on va
programmer des requtes avec dventuels arguments, retours, etc. que lon appellera par la suite.
Voici un premier exemple de procdure stocke :
CREATE PROCEDURE GetProductID
AS
SELECT ProductID
FROM Products
GO
Cet exemple montre comment crer la procdure stocke. La premire ligne, indique que lon cre une
procdure stocke (CREATE PROCEDURE) du nom de GetProductID. Le nom est de la forme
suivante :
[owner].name
O owner est le propritaire (optionnel, utilisateur de la session par dfaut) et name le nom de
la procdure stocke.
Vous auriez donc aussi pu crire les lignes suivantes pour arriver au mme rsultat :
CREATE PROCEDURE dbo.GetProductID
AS
SELECT ProductID
FROM Products
GO
47 / 61
Pour modifier une procdure stocke existante, vous pouvez utiliser le mot clef ALTER et non plus
CREATE pour changer le corps de la procdure. Changeons notre procdure stocke de tout lheure
pour afficher galement le nom des produits :
ALTER PROCEDURE GetProductID
AS
SELECT ProductID, ProductName
FROM Products
GO
5.11.3.
Pour appeler une procdure stocke, quelle soit dveloppe par un utilisateur ou quelle soit systme
(nous verrons plus loin ces diffrentes procdures stockes), il faut employer le mot clef EXEC ou
EXECUTE.
Ainsi, pour appeler notre procdure stocke GetProductID cite plus haut, utilisez :
EXEC GetProductID
Sortie (tronque) :
ProductID
----------17
3
...
64
47
ProductName
---------------------------------------Alice Mutton
Aniseed Syrup
Wimmers gute Semmelkndel
Zaanse koeken
Vous pouvez donc constater que la sortie est celle programme dans la procdure stocke. Vous
pouvez ainsi excuter tout type de requte dans une procdure stocke.
5.11.4.
Paramtres
Pour dclarer un paramtre, il suffit donc de le spcifier dans lentte de la procdure en lui indiquant :
Son nom : ici @ProductID (noubliez pas le @), qui sera utilisable comme une variable dans
la procdure stocke.
http://www.labo-dotnet.com
Ce document est la proprit de SUPINFO et est soumis aux rgles de droits dauteurs
48 / 61
Un type de donne, choisi parmi les types SQL ou les types utilisateurs.
Une valeur par dfaut optionnelle.
Une direction, En mettant OUTPUT derrire le nom dun paramtre, vous pouvez indiquer
que le paramtre est un paramtre de sortie, mais nous y reviendrons.
Pour appeler alors une telle procdure, il faut toujours utiliser EXEC ou EXECUTE, en lui adjoignant
la liste des paramtres, soit explicitement en mettant autant de couple : @paramtre=Valeur que
ncessaire, spars par une virgule :
EXEC GetSingleProduct @ProductID=20
Soit en mettant les paramtres les uns la suite des autres dans lordre attendu par la procdure
stocke, toujours spars par une virgule :
EXEC GetSingleProduct 20
Il est recommand dutiliser explicitement les noms des paramtres, car si la procdure venait tre
change, les paramtres risquent de ne plus tre les mmes ou davoir le mme ordre.
De plus, il faut faire attention au type de donnes. En effet, le type du paramtre fourni, doit soit avoir
le mme type que celui du paramtre attendu, soit tre convertible implicitement.
5.11.5.
Paramtres optionnels
Vous pouvez spcifier pour chaque paramtre une valeur par dfaut. Modifions notre prcdente
procdure comme ceci (noubliez pas dutiliser ALTER et non plus CREATE puisque la procdure
existe dj) :
ALTER PROCEDURE GetSingleProduct
(
@ProductID int = null
)
AS
IF @ProductID IS null
BEGIN
SELECT ProductID, ProductName
FROM Products
END
ELSE
BEGIN
SELECT ProductID, ProductName
FROM Products
WHERE ProductID=@ProductID
END
GO
Cette procdure stocke a deux usages : soit on ne spcifie pas de paramtre (quivaut lui donner la
valeur null, puisque cest la valeur par dfaut) et il affiche tous les produits, soit on lui donne un entier
en paramtre, et il affichera le produit correspondant.
http://www.labo-dotnet.com
Ce document est la proprit de SUPINFO et est soumis aux rgles de droits dauteurs
49 / 61
Appel avec :
EXEC GetSingleProduct @ProductID=20
Ou :
EXEC GetSingleProduct 20
Donnera :
ProductID
ProductName
----------- ---------------------------------------20
Sir Rodney's Marmalade
(1 ligne(s) affecte(s))
Appel avec :
EXEC GetSingleProduct @ProductID=default
Ou :
EXEC GetSingleProduct
Donnera :
ProductID
----------17
3
...
64
47
ProductName
---------------------------------------Alice Mutton
Aniseed Syrup
Wimmers gute Semmelkndel
Zaanse koeken
En effet, ne pas spcifier un paramtre lui donne sa valeur par dfaut. Bien sr, si le paramtre ne
possde pas de valeur par dfaut, une erreur surviendrait.
5.11.6.
Vous pouvez galement dfinir des paramtres de sortie. Ces paramtres sont modifis dans la
procdure stocke puis retourns lappelant.
Exemple : Insertion dun nouveau fournisseur (Shippers)
CREATE PROCEDURE AddShipper
(
@CompanyName nvarchar(40),
@Phone nvarchar(24),
@NewID int OUTPUT
)
AS
http://www.labo-dotnet.com
Ce document est la proprit de SUPINFO et est soumis aux rgles de droits dauteurs
50 / 61
On a donc dans un premier temps dclar notre paramtre @NewID comme tant un paramtre de
sortie. Dans la procdure stocke, on lui donne la fin la valeur de @@IDENTITY qui est une
fonction systme retournant le dernier ID insr dans la table, ce signifie que @NewID contiendra
lID du fournisseur cr linstant.
Ensuite, lors de lappel, nous avons tout dabord dclar une variable rceptacle , puis nous lavons
li au paramtre de sortie @NewID via : @NewID = @Inserted OUTPUT du EXEC. Noubliez
pas le mot clef OUTPUT, sinon, @Inserted ID gardera sa valeur davant lappel.
5.11.7.
Chaque base de donnes contient un certain nombre de procdures stockes prdfinies. Soit ce sont
des procdures stockes systme, soit incluses dans la base lors de sa cration. En effet, la cration de
la base de donne se fait en dupliquant la base de donne model . Si vous avez crit des procdures
stockes dans cette dernire, elles seront automatiquement copies dans la nouvelle base de donnes.
Pour ce qui est des procdures stockes systmes , ce sont des procdures stockes incluses dans
master que tout le monde peut appeler ( condition dy avoir le droit). Ces procdures servent
principalement ladministration du serveur, et nous ne pourrons pas les dtailler toutes ici sans sortir
du cadre de ce cours. Je vais simplement prsenter un exemple concret dutilisation : lajout dun
nouvel utilisateur une base de donne.
En effet, chaque utilisateur de base de donnes doit tre logu sur le serveur avant de pouvoir utiliser
une base de donnes. Il faut donc crer un login pour une authentification SQL Server, ou accorder
un utilisateur le droit de se loguer, pour une authentification Windows. Dans notre cas, nous allons
ajouter un utilisateur Windows, donc accordons lui le droit de se loguer :
EXEC sp_grantlogin @Loginame='SATURNE\Matthieu'
Rsultat :
http://www.labo-dotnet.com
Ce document est la proprit de SUPINFO et est soumis aux rgles de droits dauteurs
51 / 61
Nous avons ici utilis la procdure stocke systme sp_grantlogin . Pour plus de dtails, consultez
laide, mais sachez que cette procdure attend entre autre, un nom dutilisateur Windows pour lui
accorder le droit de se connecter.
USE NorthWind
EXEC sp_grantdbaccess 'SATURNE\Matthieu'
Rsultat :
Accs accord la base de donnes 'SATURNE\Matthieu'.
Ici, cest la procdure stocke systme sp_grantdbaccess que nous avons utilis. USE
Northwind est ncessaire pour se placer dans la base de donnes NorthWind, pour donner laccs
cette dernire.
Enfin, il faut indiquer quels sont les droits de cet utilisateur dans cette base de donne. Pour cela,
plutt que de donner les droits manuellement, nous allons linclure dans un groupe (ou rle) :
EXEC sp_addrolemember
@rolename='db_datareader',
@membername= 'SATURNE\Matthieu'
Enfin, nous avons inclut lutilisateur ainsi cre dans le rle db_datareader .
Pour conclure avec les procdures stockes, je vous invite consulter laide pour connatre lutilit de
chacune, et leur syntaxe. La plupart de ses procdures tant destines ladministrateur, vous naurez
que peu souvent besoin de vous en servir.
5.12.
Transactions
5.12.1.
Utilit
Les transactions permettent de dfinir des blocs de code dont le succs dexcution doit tre trait
comme un seul bloc. Plus clairement, toutes les instructions comprises dans la transaction doivent tre
excutes avec succs, ou tout le bloc sera annul.
Quel est lintrt ? Imaginons linsertion dune facture et des lignes de facturation associes. La
premire chose faire est dinsrer lenregistrement dune facture, puis, pour chaque ligne insre
lenregistrement correspondant. Si on essaye dinsrer une ligne de facturation dont le produit nexiste
pas (erreur de clef primaire/trange), une erreur va tre gnre. Deux cas de figure :
Sans transaction :
o La facture sera insre
o la premire ligne de facturation va tre insre
o la seconde ligne
o
o la nime ligne : provoque une erreur
o la requte est interrompue
o au final : une facture ajoute, et n-1 lignes alors que la facture nest pas valide.
http://www.labo-dotnet.com
Ce document est la proprit de SUPINFO et est soumis aux rgles de droits dauteurs
52 / 61
Avec transaction :
o La facture sera insre
o la premire ligne de facturation va tre insre
o la seconde ligne
o
o la nime ligne : provoque une erreur
o la requte est interrompue ET ANNULEE.
o au final : les modifications (insertion dune facture et n-1 lignes) ne seront pas prises
en compte car la transaction naura pas t excute avec succs.
Lintrt des transactions est donc de permettre dattendre quune requte soit compltement termine
avant de valider les modifications.
5.12.2.
Exemple :
Les transactions sont faciles mettre en place en T-SQL. Observez cet exemple qui excute deux fois
la mme chose, une fois sans et une fois avec une transaction:
-- Etat initial
PRINT 'Lignes actuelles de la commande 10248 :'
PRINT ''
SELECT OrderID, ProductID, UnitPrice
FROM [Order Details]
WHERE OrderID=10248
/* Ajout sans transaction d'une ligne valide et
d'une ligne non valide (product ID inexistant)*/
PRINT ''
PRINT 'Ajout du produit n14'
PRINT ''
INSERT INTO [Order Details]
( OrderID, ProductID, UnitPrice, Quantity, Discount )
VALUES
( 10248 , 14, 10, 1, 0)
PRINT ''
PRINT 'Ajout du produit n14000'
PRINT ''
INSERT INTO [Order Details]
( OrderID, ProductID, UnitPrice, Quantity, Discount )
VALUES
( 10248 , 14000, 10, 1, 0)
-- Etat actuel :
PRINT ''
PRINT 'Lignes actuelles de la commande 10248 :'
PRINT ''
SELECT OrderID, ProductID, UnitPrice
FROM [Order Details]
WHERE OrderID=10248
/* Ajout avec transaction d'une ligne valide et
d'une ligne non valide (product ID inexistant)*/
PRINT
PRINT
PRINT
BEGIN
''
'Dbut de la transaction'
''
TRANSACTION myTran
http://www.labo-dotnet.com
Ce document est la proprit de SUPINFO et est soumis aux rgles de droits dauteurs
53 / 61
PRINT ''
PRINT 'Ajout du produit n65'
PRINT ''
INSERT INTO [Order Details]
( OrderID, ProductID, UnitPrice, Quantity, Discount )
VALUES
( 10248 , 65, 10, 1, 0)
PRINT ''
PRINT 'Ajout du produit n1111'
PRINT ''
INSERT INTO [Order Details]
( OrderID, ProductID, UnitPrice, Quantity, Discount )
VALUES
( 10248 , 1111, 10, 1, 0)
IF @@ERROR <>0
ROLLBACK TRANSACTION myTran
ELSE
COMMIT TRANSACTION myTran
PRINT ''
PRINT 'Fin de la transaction'
PRINT ''
-- Etat actuel
PRINT ''
PRINT 'Lignes actuelles de la commande 10248 :'
PRINT ''
SELECT OrderID, ProductID, UnitPrice
FROM [Order Details]
WHERE OrderID=10248
Sortie :
Lignes actuelles de la commande 10248 :
OrderID
----------10248
10248
10248
ProductID
----------11
42
72
UnitPrice
--------------------14.0000
9.8000
34.8000
(3 ligne(s) affecte(s))
(1 ligne(s) affecte(s))
http://www.labo-dotnet.com
Ce document est la proprit de SUPINFO et est soumis aux rgles de droits dauteurs
ProductID
----------11
14
42
72
54 / 61
UnitPrice
--------------------14.0000
10.0000
9.8000
34.8000
(4 ligne(s) affecte(s))
Dbut de la transaction
(1 ligne(s) affecte(s))
ProductID
----------11
14
42
72
UnitPrice
--------------------14.0000
10.0000
9.8000
34.8000
(4 ligne(s) affecte(s))
Droulement de la requte.
Tout dabord, on affiche ltat actuel de la commande n10248 en affichant toutes les lignes
de facturation associes. Pour le moment il y en a 3
On tente ensuite dinsrer deux nouveaux enregistrements. Le deuxime est volontairement
invalide (contraintes de clef trangre) pour gnrer une erreur. Le droulement passe alors
sur le premier INSERT sans problme tandis que le second provoque lerreur souhaite. On
affiche alors ltat actuel, et on se rend compte quil ya 4 lignes, celle en plus provenant du
premier INSERT, le deuxime INSERT tant annul.
On retente la mme chose, cette fois ci en englobant le mme genre dinstructions dans une
transaction.
o La premire chose faire est de dclarer la transaction avec BEGIN
TRANSACTION nom_de_la_transaction . Le nom est facultatif mais permet
didentifier prcisment la transaction.
o Viennent ensuite les instructions potentiellement gnratrices derreur.
o Vous pouvez alors ordonner la transaction soit de valider les modifications via la
commande COMMIT nom_de_la_transaction , soit dannuler les modifications en
utilisant ROLLBACK nom_de_la_transaction . Ainsi, dans notre exemple, on teste
http://www.labo-dotnet.com
Ce document est la proprit de SUPINFO et est soumis aux rgles de droits dauteurs
55 / 61
la prsence dune erreur avec @@ERROR qui nest 0 que si le droulement cest
bien pass. Si il ya eu une erreur, on annule les modifications, sinon on les valide.
Dans le corps de la transaction, le premier INSERT est valide, le second provoquera une
erreur. Mais comme nous lavons englob dans une transaction, les deux seront ignors. Il
nest donc pas surprenant de voir quil ny a toujours que 4 lignes et non 5.
Les transactions sont donc utiles pour dfinir des points de validits au sein dune requte. Il faut
toutefois noter quune procdure stocke est une transaction implicite . Ainsi, si dans une procdure
stocke une erreur devait survenir, toute la procdure est annule.
Exemple :
-- Cration de la procdure stocke
CREATE PROCEDURE InsertSomething
(
@OrderID
int,
@ProductID int,
@UnitPrice money,
@Quantity
smallint,
@Discount
real
)
AS
INSERT INTO [Order Details]
(
OrderID,
ProductID,
UnitPrice,
Quantity,
Discount
)
VALUES
(
@OrderID ,
@ProductID,
@UnitPrice,
@Quantity,
@Discount
)
GO
-- Etat initial
PRINT ''
PRINT 'Lignes actuelles de la commande 10248 :'
PRINT ''
SELECT OrderID, ProductID, UnitPrice
FROM [Order Details]
WHERE OrderID=10248
-- Excution de la procdure stocke avec des valeurs "valables"
EXEC InsertSomething 10248, 65, 10, 1, 0
-- Etat actuel
PRINT ''
PRINT 'Lignes actuelles de la commande 10248 :'
PRINT ''
SELECT OrderID, ProductID, UnitPrice
http://www.labo-dotnet.com
Ce document est la proprit de SUPINFO et est soumis aux rgles de droits dauteurs
56 / 61
Sortie :
Lignes actuelles de la commande 10248 :
OrderID
----------10248
10248
10248
ProductID
----------11
42
72
UnitPrice
--------------------14.0000
9.8000
34.8000
(3 ligne(s) affecte(s))
(1 ligne(s) affecte(s))
(7 ligne(s) affecte(s))
ProductID
----------11
42
65
72
UnitPrice
--------------------14.0000
9.8000
10.0000
34.8000
(4 ligne(s) affecte(s))
Serveur : Msg 547, Niveau 16, tat 1, Procdure InsertSomething, Ligne 10
Conflit entre l'instruction INSERT et la contrainte COLUMN FOREIGN KEY
'FK_Order_Details_Products'. Le conflit est survenu dans la base de donnes
'Northwind', table 'Products', column 'ProductID'.
L'instruction a t arrte.
Lignes actuelles de la commande 10248 :
OrderID
----------10248
10248
10248
10248
ProductID
----------11
42
65
72
UnitPrice
--------------------14.0000
9.8000
10.0000
34.8000
http://www.labo-dotnet.com
Ce document est la proprit de SUPINFO et est soumis aux rgles de droits dauteurs
57 / 61
(4 ligne(s) affecte(s))
Vous pouvez constater que sans avoir eu dclarer une transaction, les INSERT non valables sont
ignors. En effet, ces INSERT sont inclus dans une procdure stocke. Cette dernire contient une
transaction implicite, et donc, sil y a une erreur, toute la procdure sera annule.
http://www.labo-dotnet.com
Ce document est la proprit de SUPINFO et est soumis aux rgles de droits dauteurs
5.13.
Curseurs
Sortie :
OrderID
ProductID
UnitPrice
Quantity
----------- ----------- --------------------- -------10248
11
14.0000
12
(0 ligne(s) affecte(s))
OrderID
ProductID
UnitPrice
Quantity
----------- ----------- --------------------- -------10248
42
9.8000
10
(0 ligne(s) affecte(s))
OrderID
ProductID
UnitPrice
Quantity
----------- ----------- --------------------- -------10248
72
34.8000
5
(0 ligne(s) affecte(s))
OrderID
ProductID
UnitPrice
Quantity
----------- ----------- --------------------- -------(0 ligne(s) affecte(s))
http://www.labo-dotnet.com
Ce document est la proprit de SUPINFO et est soumis aux rgles de droits dauteurs
58 / 61
59 / 61
http://www.labo-dotnet.com
Ce document est la proprit de SUPINFO et est soumis aux rgles de droits dauteurs
60 / 61
CONVERT(nvarchar(50), @ProductID) +
' pour rfrence'
PRINT 'Prix l''unit : ' +
CONVERT(nvarchar(50), @UnitPrice)
PRINT 'Soit un total de : ' +
CONVERT(nvarchar(50), @UnitPrice * @Quantity)
PRINT ''
-- on rcupre les valeurs pour la prochaine ligne
FETCH NEXT FROM myCursor
INTO @OrderID, @ProductID, @UnitPrice, @Quantity
END
-- Fermeture et dchargement du curseur
CLOSE myCursor
DEALLOCATE myCursor
Rsultat :
OrderID: 10248
12 exemplaires de produit ayant 11 pour rfrence
Prix l'unit : 14.00
Soit un total de : 168.00
OrderID: 10248
10 exemplaires de produit ayant 42 pour rfrence
Prix l'unit : 9.80
Soit un total de : 98.00
OrderID: 10248
5 exemplaires de produit ayant 72 pour rfrence
Prix l'unit : 34.80
Soit un total de : 174.00
Cette fois, nous avons spcifi FETCH ce quil doit faire des lignes de rsultat, c'est--dire les copier
dans les variables @OrderID, @ProductID, @UnitPrice et @Quantity. Faites bien attention, cest dans
lordre des sorties de la requte dclare dans le curseur. Ici, la colonne OrderID du SELECT du
curseur sera copie dans @OrderID et ainsi de suite.
Ces variables servent ensuite aux traitements.
Notez au passage lutilisation de CONVERT qui permet de faire des conversions explicites. Ici, on
convertit des entiers et un montaire en chane nvarchar(50).
http://www.labo-dotnet.com
Ce document est la proprit de SUPINFO et est soumis aux rgles de droits dauteurs
61 / 61
6. Conclusion
Ce document devrait vous avoir permis de dcouvrir SQL Server. Cest un SGBDR puissant et
complet avec lequel vous pourrez dvelopper des applications trs performantes et trs rapidement,
notamment grce aux supports de XML et de HTTP ainsi que grce au Transact SQL.
Vous pourrez galement voir dans le cours sur ADO.Net (http://www.labo-dotnet.com, rubrique
Supinfo Dotnet Training Courses) que vous pourrez accder aux donnes depuis le framework avec
une simplicit dconcertante.
http://www.labo-dotnet.com
Ce document est la proprit de SUPINFO et est soumis aux rgles de droits dauteurs