Vous êtes sur la page 1sur 36

Lyce lissan eddine ibn elkhatib laayoune

BTS-DSI
2013/2014




Transact SQL
Procedures
Curseurs
Dclencheurs(Triggers)


COURS + EXERCICES
Pr H.LAARAJ
Module 8 -SGBDR


2

Cours + Exercices sur Transact-SQL Pr H.LAARAJ
Lyce lissan eddine Ibn elkhatib laayoune BTS-DSI 2013 /2014
Table des matires
I- NOTIONS EN TRANSACT SQL .......................................................................................................................... 3
I.1 La declaration dune variable ................................................................................................................. 3
I.2 laffectation dune valeur une variable ............................................................................................... 3
I.3 affichage dinformations ........................................................................................................................ 4
I.4 les structures alternatives ...................................................................................................................... 4
I.5 linstruction case .................................................................................................................................... 5
I.6 Exercices : ............................................................................................................................................... 5
I.7 les structures rptitives ........................................................................................................................ 7
I.8 Le test de modification dune colonne ................................................................................................... 7
I.9 le branchement ...................................................................................................................................... 8
I.10 la transaction ........................................................................................................................................ 8
I.11 laffichage des messages derreurs ...................................................................................................... 9
II- les curseurs ................................................................................................................................................. 10
II.1 dfinition ............................................................................................................................................. 10
II.2 exercices .............................................................................................................................................. 12
III. La procdure stocke : ............................................................................................................................... 13
III.1 Cration d'une procdure stocke : ................................................................................................... 13
III.2 Cryptage dune procdure stocke .................................................................................................... 18
III.3 suppression dune procdure stocke ............................................................................................... 19
III.4 modification dune procdure stocke .............................................................................................. 19
IV les fonctions ................................................................................................................................................. 19
V- les dclencheurs (Triggers) ......................................................................................................................... 20
V.1 dfinition : ........................................................................................................................................... 20
V.2 Types de Triggers ................................................................................................................................ 21
V.3 Fonctionnement des tables inserted et deleted ................................................................................. 21
V.4 Fonctionnement des Triggers INSTEAD OF et AFTER .................................................................... 22
V.5 Cration dun dclencheur (Trigger) ................................................................................................... 22
V.6 Exercices : ............................................................................................................................................ 23
V.7 suppression dun dclencheur(Trigger) ............................................................................................. 25
V.8 modification dun dclencheur(Trigger) ............................................................................................ 25
VI les sries dexercices ................................................................................................................................... 26
VI.1 Exercices sur les procdures .............................................................................................................. 26
VI.2 Exercices sur les dclencheurs(Triggers) ............................................................................................ 31

3

Cours + Exercices sur Transact-SQL Pr H.LAARAJ
Lyce lissan eddine Ibn elkhatib laayoune BTS-DSI 2013 /2014
Pour les exemples de ce cours, la base de donnes SQL Server GestionCom qui sera utilise
est comme suivante :

I- NOTIONS EN TRANSACT SQL
I.1 La dclaration dune variable
Syntaxe :
Declare @Nom_Variable Type_Donne
Exemples :

Declare @a int
Declare @b varchar(10)

Remarque :
Par convention les noms des variables doivent toujours tre prcds du symbole @
I.2 laffectation dune valeur une variable
Syntaxe :

Select @Nom_Variable = valeur
Select @Nom_Variable = (Select ...from...Where)
ou
Set @Nom_Variable =valeur
Set @Nom_Variable = (Select ...from...Where)

Exemples :
Set @a=1
-- Affecte la valeur 1 la variable @a

Set @a=(Select count(NumArt) from Article)
-- Affecte le nombre d'articles enregistrs dans la table article la variable @a

Set @b='commande'
-- Affecte la valeur 'commande' la variable @b


4

Cours + Exercices sur Transact-SQL Pr H.LAARAJ
Lyce lissan eddine Ibn elkhatib laayoune BTS-DSI 2013 /2014
I.3 affichage dinformations
Syntaxe :

Print Elment_A_Afficher

Exemples :
Soient @a et @b des variables de type Chane de caractres, @c et @d des variables de type
entier
Print 'Bonjour' -- Affiche le texte Bonjour
Print @a -- Affiche la valeur de @a
Print @c -- Affiche la valeur de @c
Print @c + @d -- Affiche la somme des variables @c et @d
Print convert(varchar, @c) + @b
-- Affiche la valeur de @c concatn avec la valeur de @b mais puisque @c est de
type numrique et qu'on ne peut jamais concatner une valeur numrique avec une
valeur chane de caractres, il faut passer par une fonction de conversion dont la
syntaxe est la suivante :

Convert (Type de conversion, Valeur convertir)
I.4 les structures alternatives
If...Else :

Syntaxe :

If Condition
Begin
Instructions
End
Else
Begin
Instructions
End

Remarques :
Si une instruction Select apparat dans la condition, il faut la mettre entre parenthses
Si dans la clause If ou Else il existe une seule instruction, on peut omettre le Begin et le End

Exemple :
On souhaite vrifier si le stock de l'article portant le numro 10 a atteint son seuil minimum.
Si c'est le cas afficher le message 'Rupture de stock' :
Declare @QS
Declare @SM int
Select @QS = (Select QteEnStock from article Where NumArt =10)
Select @SM = (Select SeuilMinimum from article Where NumArt =10)
If @QS<=@SM
Print 'Rupture de stock'
Else
Print 'Stock disponible'


5

Cours + Exercices sur Transact-SQL Pr H.LAARAJ
Lyce lissan eddine Ibn elkhatib laayoune BTS-DSI 2013 /2014

I.5 linstruction case
Case : Permet d'affecter, selon une condition, une valeur un champ dans une requte Select
Syntaxe :

Case
When Condition1 Then Rsultat 1
When Condition2 Then Rsultat 2
...
Else Rsultat N
End
Exemple :
Afficher la liste des articles (Numro, Dsignation et prix) avec en plus une colonne
Observation qui affiche 'Non Disponible' si la quantit en stock est gale 0, 'Disponible' si la
quantit en stock est suprieure au stock Minimum et ' Commander' sinon.
Select NumArt, DesArt, PUArt, 'Observation' =
Case
When QteEnStock=0 then 'Non Disponible'
When QteEnStock>SeuilMinimum then 'Disponible'
Else ' Commander'
End
From Article


I.6 Exercices :
1.. Ecrire un programme qui calcule le montant de la commande numro 10 et affiche un
message 'Commande Normale' ou 'Commande Spciale' selon que le montant est infrieur ou
suprieur 100000 DH
2.. Ecrire un programme qui supprime l'article numro 8 de la commande numro 5 et met
jour le stock. Si aprs la suppression de cet article, la commande numro 5 n'a plus d'articles
associs, la supprimer.
3.. Ecrire un programme qui affiche la liste des commandes et indique pour chaque
commande dans une colonne Type s'il s'agit d'une commande normale (montant <=100000
DH) ou d'une commande spciale (montant > 100000 DH)
4.. A supposer que toutes les commandes ont des montants diffrents, crire un programme
qui stocke dans une nouvelle table temporaire les 5 meilleures commandes (ayant le montant
le plus lev) classes par montant dcroissant (la table crer aura la structure suivante :
NumCom, DatCom, MontantCom)
5.. Ecrire un programme qui :
Recherche le numro de commande le plus lev dans la table commande et
l'incrmente de 1
Enregistre une commande avec ce numro
Pour chaque article dont la quantit en stock est infrieure ou gale au seuil minimum
enregistre une ligne de commande avec le numro calcul et une quantit commande
gale au triple du seuil minimum



6

Cours + Exercices sur Transact-SQL Pr H.LAARAJ
Lyce lissan eddine Ibn elkhatib laayoune BTS-DSI 2013 /2014
Solution :
1.
Declare @Montant decimal
Set @Montant=(Select Sum(PUArt*QteCommandee) from Commande C, Article A,
LigneCommande LC where C.NumCom=LC.NumCom and LC.NumArt=A.NumArt and
C.NumCom=10)
If @Montant is null
Begin
Print 'Cette Commande n''existe pas ou elle n''a pas d''ingrdients'
Return
End
if @Montant <=10000
Print 'Commande Normale'
Else
Print 'Commande Spciale'


2.
Declare @Qte decimal
Set @Qte=(select QteCommandee from LigneCommande where NumCom=5 and
NumArt=8)
Delete from LigneCommande where NumCom=5 and NumArt=8
Update article set QteEnStock=QteEnStock+@Qte where NumArt=8
if not exists (select numcom from LigneCommande where NumCom=5)
Delete from commande where NumCom=5



3.
Select C.NumCom, DatCom, Sum(PUArt*QteCommandee), 'Type'=
Case
When Sum(PUArt*QteCommandee) <=10000 then 'Commande Normale'
Else 'Commande Spciale'
End
From Commande C, Article A, LigneCommande LC
Where C.NumCom=LC.NumCom and LC.NumArt=A.NumArt
Group by C.NumCom, DatCom



4.
Create Table T1 (NumCom int, DatCom DateTime, MontantCom decimal)
Insert into T1 Select Top 5 C.NumCom, DatCom, Sum(PUArt*QteCommandee) as Mt
From Commande C, Article A, LigneCommande LC
Where C.NumCom=LC.NumCom and LC.NumArt=A.NumArt
Group by C.NumCom, DatCom
Order by Mt Desc


7

Cours + Exercices sur Transact-SQL Pr H.LAARAJ
Lyce lissan eddine Ibn elkhatib laayoune BTS-DSI 2013 /2014

5.
if exists(select NumArt from article where QteEnStock<=SeuilMinimum)
Begin
Declare @a int
set @a=(select max(NumCom) from commande) + 1
insert into commande values(@a, getdate())
insert into lignecommande Select @a, NumArt, SeuilMinimum * 3
From article Where QteEnStock <=SeuilMinimum
End


I.7 les structures rptitives
Syntaxe :

While Condition
Begin
instructions
End
Remarques :
Le mot cl Break est utilis dans une boucle While pour forcer l'arrt de la boucle
Le mot cl Continue est utilis dans une boucle While pour annuler l'itration en
cours et passer aux itrations suivantes (renvoyer le programme la ligne du while)
Exemple :
Tant que la moyenne des prix des articles n'a pas encore atteint 20 DH et le prix le plus lev
pour un article n'a pas encore atteint 30 DH, augmenter les prix de 10% et afficher aprs
chaque modification effectue la liste des articles. Une fois toutes les modifications
effectues, afficher la moyenne des prix et le prix le plus lev :
While ((Select avg(puart) from article)<20) and (select max(puart) from article) <30)
Begin
Update article Set puart=puart+(puart*10)/100
Select * from article
End
Select avg(puart) as moyenne , max(puart) as [Prix lev] from article


I.8 Le test de modification dune colonne
L'instruction If Update renvoie une valeur true ou false pour dterminer si une colonne
spcifique d'une table a t modifi par une instruction insert ou update (cette instruction est
utilise spcialement dans les dclencheurs et ne s'applique pas une instruction Delete).
Syntaxe :
If Update (Nom_Colonne)
Begin

End
Exemple :

If update (numCom)
Print 'Numro de commande modifi'


8

Cours + Exercices sur Transact-SQL Pr H.LAARAJ
Lyce lissan eddine Ibn elkhatib laayoune BTS-DSI 2013 /2014

I.9 le branchement
L'instruction Goto renvoie l'excution du programme vers un point spcifique repr par une
tiquette
Syntaxe :
Goto Etiquette

Remarque :
Pour crer une tiquette, il suffit d'indiquer son nom suivi de deux points (:)

Exemple :
L'exemple prcdent peut tre crit ainsi en utilisant l'instruction goto :
Declare @a decimal, @b decimal
Etiquette_1:
Set @a= (Select avg(puart) from article)
Set @b= (Select Max(puart) from article)
If @a<20 and @b<30
Begin
Update article Set puart=puart+(puart*20)/100
Select * from article
Goto Etiquette_1
End
Select avg(puart) as moyenne , max(puart) as [Prix lev] from article


I.10 la transaction
Une transaction permet d'excuter un groupe d'instructions. Si pour une raison ou une autre
l'une de ces instructions n'a pas pu tre excute, tous le groupe d'instructions est annul (le
tout ou rien) :
Pour dmarrer une transaction on utilise l'instruction Begin Tran
Pour valider la transaction et rendre les traitements qui lui sont associs effectifs, on
utilise l'instruction Commit Tran
Pour interrompre une transaction en cours qui n'a pas encore t valide, on utilise
l'instruction Rollback Tran
Si plusieurs transactions peuvent tre en cours, on peut leur attribuer des noms pour
les distinguer


Syntaxe :
Begin Tran [Nom_Transaction]

If Condition
RollBack Tran [Nom_Transaction]

Commit Tran [Nom_Transaction]



9

Cours + Exercices sur Transact-SQL Pr H.LAARAJ
Lyce lissan eddine Ibn elkhatib laayoune BTS-DSI 2013 /2014
Exemple :
Supposons qu'il n'existe pas de contrainte cl trangre entre le champ NumCom de la table
LigneCommande et le champ NumCom de la Commande.
On souhaite supprimer la commande numro 5 ainsi que la liste de ces articles. Le programme
serait :
Delete from Commande where NumCom=5
Delete from LigneCommande where NumCom=5


Mais si, juste aprs l'excution de la premire instruction et alors que la deuxime n'a pas
encore eu lieu, un problme survient (une coupure de courant par exemple) la base de donnes
deviendra incohrente car on aura des lignes de commande pour une commande qui n'existe
pas.
En prsence d'une transaction, le programme n'ayant pas atteint l'instruction Commit Tran,
aurait annul toutes les instructions depuis Begin Tran. Le programme devra tre alors :
Begin Tran
Delete from Commande where NumCom=5
Delete from LigneCommande where NumCom=5
Commit Tran


I.11 laffichage des messages derreurs
L'instruction Raiserror affiche un message d'erreur systme. Ce message est cr par
l'utilisateur ou appel partir de la table SysMessages de la base de donnes Master (table
contenant la liste des messages systmes disponibles en SQL Server).

Syntaxe :

Raiserror (Num message|Texte message, gravit, tat[, Param1, Param2... ] )

Description :
Numro du message : Indiquer le numro de message pour faire appel un message
dj disponible dans la table SysMessages.
Texte Message : Reprsente le texte du message. Pour rendre certaines parties du
message paramtrables, Il faut la reprsenter avec %d. Les valeurs affecter ces
paramtres seront spcifis par l'instruction raiserror (au maximum 20 paramtres
peuvent tre utilises dans un message).
Gravit : Reprsente le niveau de gravit. Seul l'administrateur systme peut ajouter
des messages avec un niveau de gravit compris entre 19 et 25 (consulter l'aide
Transact-SQL dans l'analyseur de requtes SQL pour le dtail des niveaux de gravit).
Etat : Valeur entire comprise entre 1 et 127 qui identifie la source partir de laquelle
l'erreur a t mise (consulter l'aide Transact-SQL pour le dtail sur les diffrents
tats).
Param : Paramtres servant la substitution des variables dfinies dans le message.
Les paramtres ne peuvent tre que de type int, varchar, binary ou varbinary


10

Cours + Exercices sur Transact-SQL Pr H.LAARAJ
Lyce lissan eddine Ibn elkhatib laayoune BTS-DSI 2013 /2014
II- les curseurs
II.1 dfinition
Un curseur est un groupe d'enregistrements rsultat de l'interrogation d'une base de donnes.
L'intrt d'utiliser des curseurs est de pouvoir faire des traitements ligne par ligne chose qui
n'est pas possible avec une requte SQL simple o un seul traitement sera appliqu toutes
les lignes rpondant cette requte et seul le rsultat final sera visible.

Il existe plusieurs types de curseurs :
Curseurs dfilement en avant (Forward Only) : A l'ouverture du curseur, la base de
donnes est interroge et la requte associe au curseur est traite. Une copie des
enregistrements rpondant aux critres demands est cre. De ce fait toutes les
modifications effectues sur les enregistrements du curseur ne seront pas visibles sur la
base de donnes source tant que le curseur n'a pas t ferm. De mme si d'autres
utilisateurs ont opr des modifications sur la base de donnes source, celles ci ne seront
visibles que si le curseur a t ferm et r ouvert. Ce type de curseur ne met, la
disposition de l'utilisateur, q'une seule ligne la fois. Cette ligne peut tre lue et mise jour
et l'utilisateur ne peut se dplacer que vers la ligne suivante (accs squentiel) .

Curseurs statiques (Static) : Ce curseur cre une copie statique de toutes les lignes
concernes de la base de donnes source. Les modifications apportes ne vont tre visibles
que si le curseur a t ferm et r-ouvert. L'avantage de ce type de curseur par rapport au
prcdent c'est que l'accs peut se faire partir d'une ligne dans diffrents sens (MoveFirst,
MoveNext, MovePrior, MoveLast) .


Curseurs d'ensemble de valeurs cls (Keyset) : Une cl (un signet) faisant rfrence la
ligne d'origine de la base de donnes source est cre et enregistre pour chaque ligne du
curseur cela permet d'accder aux donnes en temps rel la lecture ou la manipulation
d'une ligne du curseur. Le dplacement entre les lignes dans ce genre de curseur est sans
restriction (MoveFirst, MoveNext, MovePrior, MoveLast) et la mise jour des donnes est
possible. Remarque : La liste des membres est fige ds que l'ensemble des valeurs cls est
rempli.

Curseurs dynamiques (Dynamic) : Avec ce type de curseurs, le systme vrifie en
permanence si toutes les lignes vrifiant la requte du curseur sont incluses. Ce curseur ne
cre pas de cl sur les lignes ce qui le rend plus rapide que le curseur Keyset mais il
consomme plus de ressources systme.

Syntaxe
Pour dclarer un curseur

Declare nom_curseur Cursor Static
Keyset
Dynamic
For Select

Pour ouvrir un curseur
Open nom_curseur


11

Cours + Exercices sur Transact-SQL Pr H.LAARAJ
Lyce lissan eddine Ibn elkhatib laayoune BTS-DSI 2013 /2014
Pour lire un enregistrement partir d'un curseur

Atteindre le premier enregistrement du curseur
Fetch First from nom_curseur into variable1, variable2,..

Atteindre l'enregistrement du curseur suivant celui en cours
Fetch Next from nom_curseur into variable1, variable2,...
ou Fetch nom_curseur into variable1, variable2
Atteindre l'enregistrement du curseur prcdent celui en cours
Fetch Prior from nom_curseur into variable1, variable2,...


Atteindre le dernier enregistrement du curseur
Fetch Last from nom_curseur into variable1, variable2,...

Atteindre l'enregistrement se trouvant la position n dans le curseur
Fetch absolute n from nom_curseur into variable1, variable2,...

Atteindre l'enregistrement se trouvant aprs n positions de la ligne en cours
Fetch Relative Num_Ligne from nom_curseur into variable1, variable2,...

Remarque : La variable systme @@fetch_status est utilise pour dtecter la fin du curseur.
Tant que cette variable a la valeur 0, on a pas encore atteint la fin du curseur.

Fermer un curseur
Close nom_curseur

Librer les ressources utilises par un curseur :
Deallocate Nom_Curseur

Exemple :
Pour afficher la liste des articles sous la forme :
L'article Numro ........ portant la dsignation cote . ..

Declare @a int, @b Varchar(10), @c real
Declare Cur_ListeArt Cursor for Select NumArt, DesArt,puart from article
Open Cur_ListeArt
Fetch Next from Cur_ListeArt into @a,@b,@c
While @@fetch_status=0
Begin
Print 'L''article numro ' + convert(varchar,@a) + ' portant la dsignation ' + @b+ '
cote ' + convert(varchar,@c)
Fetch Next from Cur_ListeArt into @a,@b,@c
End
Close Cur_ListeArt
Deallocate Cur_ListeArt



12

Cours + Exercices sur Transact-SQL Pr H.LAARAJ
Lyce lissan eddine Ibn elkhatib laayoune BTS-DSI 2013 /2014

II.2 exercices

1- Ecrire un programme qui pour chaque commande :
Affiche le numro et la date de commande sous la forme :
Commande N : Effectue le :
La liste des articles associs
Le montant de cette commande

2- Ecrire un programme qui pour chaque commande vrifie si cette commande a au moins
un article. Si c'est le cas affiche son numro et la liste de ses articles sinon affiche un
message d'erreur :
Aucun article pour la commande . Elle sera supprime et supprime cette commande

Solutions :
1.
Declare @a int, @b DateTime, @c decimal

Declare C1 Cursor for Select C.NumCom,DatCom, Sum(PUArt*QteCommandee)
From Commande C, Article A, LigneCommande LC
Where C.NumCom=LC.NumCom and LC.NumArt=A.NumArt group by C.NumCom,DatCom

Open C1

Fetch Next from C1 into @a,@b,@c
While @@fetch_status =0
Begin
Print 'Commande N : ' + convert(varchar,@a) + ' effectue le : ' + convert(varchar,@b)
Select Numart from LigneCommande where numcom=@a
Print 'Son montant est : ' + convert(varchar,@c)
Fetch Next from C1 into @a,@b,@c
End

Close C1
Deallocate C1









13

Cours + Exercices sur Transact-SQL Pr H.LAARAJ
Lyce lissan eddine Ibn elkhatib laayoune BTS-DSI 2013 /2014
2..
Declare @a int

Declare Cur_Com Cursor for select NumCom from Commande

open Cur_Com

Fetch Next from Cur_Com into @a
While @@fetch_status =0
Begin
if not exists (Select NumArt from LigneCommande where NumCom=@a)
Begin
Print 'Aucun article pour la commande N : ' + convert(varchar, @a) + '. Elle sera
supprime'
Delete From Commande Where NumCom=@a
End
Else
Begin
Print 'Commande n : ' + convert(varchar, @a)
Select A.NumArt, DesArt, PUArt, QteCommandee
From Article A, Lignecommande LC
Where A.NumArt=LC.NumArt and NumCom=@a
End
Fetch Next from Cur_Com into @a
End

Close Cur_Com
Deallocate Cur_Com

III. La procdure stocke :
III.1 Cration d'une procdure stocke :

III.1.1 Sans paramtres :
La procdure stocke excute un traitement donn mais ce traitement ne dpend d'aucune
valeur provenant de l'application appelante.

Syntaxe :
Create Procedure Nom_Procdure as
Instructions

Excution :
Exec Nom_Procedure

Exemples :

1. Crer une procdure stocke nomme SP_Articles qui affiche la liste des articles avec
pour chaque article le numro et la dsignation :



14

Cours + Exercices sur Transact-SQL Pr H.LAARAJ
Lyce lissan eddine Ibn elkhatib laayoune BTS-DSI 2013 /2014

Create Procedure SP_Articles as
Select NumArt, DesArt from Article

--Excuter cette procdure :
Exec SP_Articles

2. Crer une procdure stocke qui calcule le nombre d'articles par commande :

Create Procedure SP_NbrArticlesParCommande as
Select Commande.NumCom, DatCom, Count(NumArt)
From Commande, LigneCommande
Where Commande.NumCom=LigneCommande.NumCom
Group by Commande.NumCom, DatCom

--Excuter cette procdure :
Exec SP_NbrArticlesParCommande


III.1.2 Avec des paramtres en entre :
La procdure stocke en fonction de valeurs provenant de l'extrieur va effectuer certains
traitements et donc il n'est pas normal qu'une procdure stocke reoive des paramtres en
entre dont les valeurs ne soient pas exploites dans les instructions des procdures (dans des
tests, dans des conditions)

Syntaxe :
Create Procedure Nom_Propritaire.Nom_Procedure
Nom_Param1_Entre Type_Donne = Valeur_Par_Defaut,
Nom_Param2_Entre Type_Donne = Valeur_Par_Defaut
as
Instructions

Excution :
Exec Nom_Procedure Valeur_Param1, Valeur_Param2...
Ou
Exec Nom_Procedure Nom_Param1 = Valeur_Param1, Nom_Param2 = Valeur_Param2...

Remarque:
Avec la deuxime syntaxe, l'utilisateur n'est pas oblig de passer les paramtres dans l'ordre et
en plus si des paramtres ont des valeurs par dfaut, il n'est pas oblig de les passer.

Exemples :
1. Crer une procdure stocke nomme SP_ListeArticles qui affiche la liste des articles
d'une commande dont le numro est donn en paramtre :

Create Procedure SP_ListeArticles @NumCom int as
Select A.NumArt, NomArt, PUArt, QteCommandee
From Article A, LigneCommande LC
Where LC.NumArt=A.NumArt and LC.NumCom=@NumCom

--Excuter cette procdure pour afficher la liste des articles de la commande numro 1 :
Exec SP_ListeArticles 1

15

Cours + Exercices sur Transact-SQL Pr H.LAARAJ
Lyce lissan eddine Ibn elkhatib laayoune BTS-DSI 2013 /2014

--Ou
Declare @nc int
Set @nc=1
Exec SP_ListeArticles @nc


2. Crer une procdure stocke nomme SP_ComPeriode qui affiche la liste des
commandes effectues entre deux dates donnes en paramtre :

Create Procedure SP_ComPeriode @DateD DateTime, @DateF DateTime as
Select * from Commande Where datcom between @dateD and @DateF

--Excuter cette procdure pour afficher la liste des commandes effectues entre le
--10/10/2006 et le 14/12/2006 :

Exec SP_ComPeriode '10/10/2006', '14/12/2006'
--Ou
Declare @dd DateTime, @df DateTime
Set @dd='10/10/2006'
Set @df='14/12/2006'
Exec SP_ComPeriode @dd, @df


3. Crer une procdure stocke nomme SP_TypeComPeriode qui affiche la liste des
commandes effectues entre deux dates passes en paramtres. En plus si le nombre
de ces commandes est suprieur 100, afficher 'Priode rouge'. Si le nombre de ces
commandes est entre 50 et 100 afficher 'Priode jaune' sinon afficher 'Priode blanche'
(exploiter la procdure prcdente) :

Create Procedure SP_TypeComPeriode @DateD DateTime, @DateF DateTime as
Exec SP_ComPeriode @DateD, @DateF
Declare @nbr int
Set @nbr=(Select count(NumCom) from Commande Where datcom between @dateD and
@DateF)
If @nbr >100
Print 'Priode Rouge'
Else
Begin
If @nbr<50
Print 'Priode blanche'
Else
Print 'Priode Jaune'
End


4. Crer une procdure stocke nomme SP_EnregistrerLigneCom qui reoit un numro
de commande, un numro d'article et la quantit commande :
Si l'article n'existe pas ou si la quantit demande n'est pas disponible afficher un
message d'erreur
Si la commande introduite en paramtre n'existe pas, la crer
Ajoute ensuite la ligne de commande et met le stock jour

16

Cours + Exercices sur Transact-SQL Pr H.LAARAJ
Lyce lissan eddine Ibn elkhatib laayoune BTS-DSI 2013 /2014

Create Procedure SP_EnregistrerLigneCom @numCom int, @numart int, @qte decimal AS
if not exists(select numart from article where numart=@numart)
or (select Qteenstock from article where numart=@numart) < @qte
Begin
Print 'Cet article n''existe pas ou stock est insuffisant'
Return
End
Begin transaction
if not exists(select numcom from Commande where numCom=@numcom)
insert into commande values(@NumCom,getdate())
insert into ligneCommande values(@NumCom, @Numart,@Qte)
update article set QteEnStock=QteEnStock- @Qte where NumArt=@NumArt
Commit Transaction



III.1.3 Avec des paramtres en sortie :
La procdure stocke suite un traitement ralis va attribuer des valeurs des paramtres en
sortie. Les valeurs de ces paramtres peuvent tre rcupres par des applications clientes. Il
n'est pas normal qu'une procdure stocke contenant des paramtres de sortie n'affecte pas de
valeurs ces paramtres avant la fin du traitement.

Remarque :
Les procdures utilisant des paramtres de sortie peuvent avoir ou ne pas avoir (selon le
besoin) des paramtres en entre

Syntaxe :
Create Procedure Nom_Propritaire.Nom_Procedure
Nom_Param1_Entre Type_Donne = Valeur_Par_Defaut,
Nom_Param1_Entre Type_Donne = Valeur_Par_Defaut,
Nom_Param1_Sortie Type_Donne Output,
Nom_Param2_Sortie Type_Donne Output...
as
Instructions

--Excution :
Declare Var_Param1_Sortie Type_Param1_Sortie
Declare Var_Param2_Sortie Type_Param2_Sortie
...
Exec Nom_Procedure Val_Param1_Entre, Val_Param2_Entre...,
Var_Param1_Sortie Output, Var_Param2_Sortie Output...

Exemples :

1. Crer une procdure stocke nomme SP_NbrCommandes qui retourne le nombre de
commandes :


Create Procedure SP_NbrCommandes @Nbr int output as
Set @Nbr = (Select count(NumCom) from Commande)

17

Cours + Exercices sur Transact-SQL Pr H.LAARAJ
Lyce lissan eddine Ibn elkhatib laayoune BTS-DSI 2013 /2014

--Excuter cette procdure pour afficher le nombre de commandes :
Declare @n int
Exec SP_NbrCommandes @n Output
Print 'Le nombre de commandes : ' + convert(varchar,@n)



2. Crer une procdure stocke nomme SP_NbrArtCom qui retourne le nombre
d'articles d'une commande dont le numro est donn en paramtre :

Create Procedure SP_NbrArtCom @NumCom int, @Nbr int output as
Set@Nbr = (Select count(NumArt) from LigneCommande where NumCom=@NumCom)

--Excuter cette procdure pour afficher le nombre d'articles de la commande numro 1 :
Declare @n int
Exec SP_NbrArtCom 1, @n Output
Print 'Le nombre d'articles de la commande numro 1 est : ' + convert(varchar,@n)
Ou
Declare @nc int, @n int
Set @nc=1
Exec SP_NbrArtCom @nc, @n Output
Print 'Le nombre d'articles de la commande numro ' + convert(varchar,@nc) + ' est : ' +
convert(varchar,@n)



3. Crer une procdure stocke nomme SP_TypePeriode qui retourne le type de la
priode en fonction du nombre de commande. Si le nombre de commandes est
suprieur 100, le type sera 'Priode rouge'. Si le nombre de commandes est entre 50
et 100 le type sera 'Priode jaune' sinon le type sera 'Priode blanche' (exploiter la
procdure SP_NbrCommandes) :

Create Procedure SP_TypePeriode @TypePer varchar(50) output as
Declare @NbrCom int
Exec SP_NbrCommandes @NbrCom output
If @NbrCom >100
Set @Type='Priode Rouge'
Else
Begin
If @NbrCom <50
Set @Type= 'Priode blanche'
Else
Set @Type= 'Priode Jaune'
End


III.1.4 Avec valeur de retour :
L'instruction return arrte l'excution d'une procdure stocke. Une valeur entire
reprsentant, en gnral, l'tat d'excution d'une procdure peut tre associe l'instruction
return. Cette valeur peut tre rcupre par le programme appelant de la procdure stocke.



18

Cours + Exercices sur Transact-SQL Pr H.LAARAJ
Lyce lissan eddine Ibn elkhatib laayoune BTS-DSI 2013 /2014
Remarque :
Les procdures ayant une valeur de retour peuvent avoir ou ne pas avoir (selon le
besoin) des paramtres en entre ou des paramtres de sortie ;
Pour dtecter les erreurs systme, SQL Server offre la variable globale @@ERROR
qui retourne le code d'erreur dclench par SQL Server. Si la valeur de cette variable
est 0 c'est qu'aucune erreur n'a t gnre.

Syntaxe :
Create Procedure Nom_Propritaire.Nom_Procedure
...
as
Instructions
...
Return Valeur_Sortie

Excution :
Declare Var_Retour Type_Var_Retour
...
Exec Var_Retour=Nom_Procedure

Exemple :
Crer une procdure stocke nomme SP_TypePeriode qui renvoie un code de retour. Si le
nombre de commandes est suprieur 100, la procdure renvoie 1. Si le nombre de
commandes est entre 50 et 100, la procdure renvoie 2. Si le nombre de commandes est
infrieur 50, la procdure renvoie 3. Si une erreur systme a lieu, la procdure renvoie 4 :

Create Procedure SP_TypePeriode as
Declare @NbrCom int
Set @NbrCom = (Select count(NumCom) from Commande)
If @NbrCom >=100
Return 1
If @NbrCom >50
Return 2
If @NbrCom <=50
Return 3
If @@ERROR <>0
Return 4


III.2 Cryptage dune procdure stocke
Il est possible de rendre le code de la procdure stocke inaccessible, il suffit pour cela de
procder un cryptage. La procdure stocke pourra tre excute par un programme externe
mais son contenu sera illisible que cela soit pour son propritaire ou pour d'autres utilisateurs.

Remarque :
Cette procdure est irrversible

Syntaxe :
Create Procedure . WITH ENCRYPTION as
Instructions

19

Cours + Exercices sur Transact-SQL Pr H.LAARAJ
Lyce lissan eddine Ibn elkhatib laayoune BTS-DSI 2013 /2014

III.3 suppression dune procdure stocke
Syntaxe :
Drop Procedure Nom_Procdure

Exemple :
Drop Procedure NbrArticlesCommande

III.4 modification dune procdure stocke

Il existe plusieurs manires de crer une procdure stocke :
A partir d'entreprise Manager :
Accder la procdure stocke concerne, double cliquer dessus. Apporter les
modifications souhaites et valider
A partir d'une application client : Une procdure stocke peut tre modifie en
utilisant l'instruction Transact-SQL Alter Procedure partir de n'importe quelle
application client :

Syntaxe :
Alter Procedure Nom_Procdure as
Nouvelles instructions

Remarque :
La modification du contenu d'une procdure stocke n'affecte pas les permissions d'accs
associes cette procdure ce qui n'est pas le cas lors d'une suppression.
IV les fonctions
IV.1 Fonction qui retourne une valeur scalaire
Syntaxe :
Create Function Nom_Procedure (Nom_Param1 Type_Donne, )
Returns type_de_retour
as
Instructions
...
Return Valeur
Exemple :
Crer une fonction nomme F_NbrCommandes qui retourne le nombre de commandes :

Create Function F_NbrCommandes() Returns int
as
begin
declare @Nbr int
Set @Nbr = (Select count(NumCom) from Commande)
Return @Nbr
end



20

Cours + Exercices sur Transact-SQL Pr H.LAARAJ
Lyce lissan eddine Ibn elkhatib laayoune BTS-DSI 2013 /2014

IV.2 Fonction qui retourne une table

Syntaxe :
Create Function Nom_Fonction (Nom_Param1 Type_Donne, ) Returns nom_table
Table ( champ1 type1, )
as
Select
Return

Exemple :
Crer une fonction nomme F_ListeArticles qui return la liste des articles d'une commande
dont le numro est donn en paramtre :

Create Function F_ListeArticles (@NumCom int ) Returns Liste-Art Table ( Num int , nom
varchar(29))
as
Select A.NumArt, NomArt From Article A, LigneCommande LC
Where LC.NumArt=A.NumArt and LC.NumCom=@NumCom

--Excuter cette procdure pour afficher la liste des articles de la commande numro 1 :
Select * from F_ListeArticles (1)




V- les dclencheurs (Triggers)
V.1 dfinition :
Les triggers peuvent intercepter les oprations sur les donnes de la table avant qu'elles ne
soient dfinitivement appliques. Ils peuvent alors interrompre les traitements de mise jour
et selon certaines conditions annuler ces modifications, leur associer des traitements
complmentaires ou laisser le systme poursuivre leur validation. Les dclencheurs peuvent
tre associs trois types d'actions de dclenchement sur une table :
Dclencheurs d'insertion : Se dclenchent suite une opration d'ajout
d'enregistrements dans la table ;
Dclencheurs de modification : Se dclenchent suite une opration de modification
des enregistrements de la table ;
Dclencheurs de suppression : Se dclenchent suite une opration de suppression
d'enregistrements partir de la table.



Remarque

21

Cours + Exercices sur Transact-SQL Pr H.LAARAJ
Lyce lissan eddine Ibn elkhatib laayoune BTS-DSI 2013 /2014
Les triggers consomment peu de ressources systme condition qu'ils n'utilisent pas de
curseurs.
V.2 Types de Triggers
Les dclencheurs peuvent tre de deux types : INSTEAD OF et AFTER.
Les dclencheurs INSTEAD OF :
Sont excuts la place de l'action de dclenchement ;
Sont vrifis avant les contraintes d'intgrit associes la table ce qui permet de
mettre en place des traitements qui compltent les actions de ces contraintes ;
Peuvent tre associs aussi bien des tables qu' des vues ce qui permet la mise jour
des donnes associes ces vues ;
Ne peuvent tre associs des tables cible de contraintes d'intgrit rfrentielle en
cascade ;
Un seul dclencheur INSTEAD OF est autoris par action de dclenchement dans une
table
Mme si un trigger INSTEAD OF contient une action d'insertion sur la table ou la vue
laquelle il est associ, il ne sera jamais excut nouveau (excution non rcursive).
Les dclencheurs AFTER :
Sont excuts aprs la validation des contraintes associes la table. Si une contrainte
n'est pas vrifie ce type de dclencheurs ne se dclenchera jamais ;
Ne peuvent tre associs qu' des tables ;
Plusieurs dclencheurs AFTER sont autoriss sur une mme table et pour une mme
action de dclenchement. La procdure stocke systme sp_SetTriggerOrder permet
de spcifier le premier et le dernier dclencheur excuter pour une action :

Exec sp_SetTriggerOrder
@triggername = 'MyTrigger',
@order = 'first|Last|None',
@stmttype = 'Insert|Update|Delete'
V.3 Fonctionnement des tables inserted et deleted
Au cours des oprations d'ajout, de suppression et de modification, le systme utilise les
tables temporaires inserted et deleted. Ces tables ne sont accessibles qu'au niveau des triggers
et leur contenu est perdu ds que les triggers sont valids.
Action d'ajout : Les enregistrements ajouts sont placs dans une table temporaire nomme
inserted ;
Action de suppression : Les enregistrements supprims sont placs dans une table
temporaire nomme deleted.
Action de modification : L'opration de modification est interprte comme une
opration de suppression des anciennes informations et d'ajout des nouvelles
informations. C'est pourquoi le systme utilise dans ce cas les deux tables temporaires
deleted et inserted. En fait quand un utilisateur demande modifier des
enregistrements, ceux ci sont d'abord sauvegards dans la table temporaire deleted et
la copie modifie est enregistre dans la table inserted.


22

Cours + Exercices sur Transact-SQL Pr H.LAARAJ
Lyce lissan eddine Ibn elkhatib laayoune BTS-DSI 2013 /2014
V.4 Fonctionnement des Triggers INSTEAD OF et AFTER
Cas o seul un trigger INSTEAD OF est associ l'action de mise jour (insert, delete
ou update) : Dans le trigger INSTEAD OF, les enregistrements ajouts
(respectivement modifis ou supprims) apparaissent uniquement dans les tables
temporaires mais pas dans la table d'origine et si le code associ ce trigger ne prend
pas en charge l'ajout (respectivement la modification ou la suppression) de ces
enregistrements, ils ne seront pas ajouts (respectivement modifis et supprims)
mme si aucune action n'annule le dclencheur.
Exemple :
Un utilisateur excute l'action suivante :
Insert into commande values (100,'13/09/07')
Supposons qu'un trigger instead of est associ l'action d'insertion sur la table commande.
Dans le corps de ce trigger, on affiche le contenu de la table inserted et le contenu de la table
commande.
Dans la table inserted, on remarquera la prsence de la commande numro 100 mais dans la
table commande cet enregistrement est absent et ne sera pas ajout la table commande
mme aprs la fin de l'excution de l'action d'ajout. Ceci est d au fait que l'excution des
triggers instead of remplace l'action de dclenchement.

Cas o seul des triggers AFTER sont associs l'action de mise jour (insert, delete
ou update) : Les contraintes sont testes en premier. Si une contrainte n'est pas vrifie
l'insertion est annule sans que le trigger soit excut. Si les contraintes sont vrifies,
le trigger est excut. Les enregistrements ajouts apparaissent et dans la table
d'origine et dans les tables temporaires concernes par l'action. Si dans le code associ
ce trigger, aucune action n'annule la transaction, l'opration est valide.

Cas o un trigger INSTEAD OF ainsi que des triggers AFTER sont associs l'action
de mise jour (insert, delete ou update) : Le trigger INSTEAD OF est excut en
premier, les enregistrements concerns par l'action de mise jour (insert, delete ou
update) apparaissent uniquement dans les tables temporaires mais pas dans la table
d'origine et si le code associ ce trigger ne prend pas en charge les oprations sur ces
enregistrements, ils ne seront pas ajouts (modifis ou supprims) mme si aucune
action n'annule le trigger et les triggers AFTER ne seront pas excuts.

Si le trigger INSTEAD OF, dclenche une opration (ajout, modification ou
suppression) sur la mme table, les triggers AFTER vont se dclencher et les tables
temporaires au sein de ces triggers vont contenir les nouvelles valeurs manipules.
Si d'autres instructions se trouvent aprs l'instruction de mise jour (insert, delete ou
update) dans le trigger instead of, elles seront excutes aprs la fin de l'excution des
triggers After sauf si une instruction Rollback a t rencontre.

V.5 Cration dun dclencheur (Trigger)
Syntaxe :
Create Trigger Nom_Trigger
On Nom_Table
Instead Of | For Opration1, Opration2...
As
Instructions

23

Cours + Exercices sur Transact-SQL Pr H.LAARAJ
Lyce lissan eddine Ibn elkhatib laayoune BTS-DSI 2013 /2014

Remarque :
Opration peut prendre Insert, Delete ou Update selon le type de trigger crer
Un mme trigger peut tre associ une seule opration ou plusieurs oprations la
fois
A chaque table, peuvent tre associes trois triggers au maximum : ajout, modification
et suppression (un trigger concernant deux oprations est compt comme deux
triggers)
Le corps du trigger cr peut inclure n'importe quelles instructions except Create
Database, Alter Database, Drop Database, Restore Database, Restore Log et
reconfigure ;

V.6 Exercices :
1. Le trigger suivant interdit la modification des commandes

Create Trigger Tr_Empcher_Modif
On Commande
For Update
As
Rollback

2. Le trigger suivant interdit la modification du numro de commande et vrifie si la
date saisie pour la date de commande est suprieure ou gale la date du jour

Create Trigger Tr_Empcher_Modif_Numcom
On Commande
For Update
As
if update(NumCom)
Begin
Raiserror('le numro de commande ne peut tre modifi',15,120)
Rollback
End
if update(DatCom)
Begin
if ((select count (DatCom) from inserted
Where datediff(day,datcom,getdate() )>0)<> 0)
Begin
Raiserror('La date de commande ne peut pas tre infrieur la date en cours',15,120)
Rollback
End
End



3. Le trigger suivant empche la suppression des commandes ayant des articles
associs
Remarque : Ce trigger ne se dclenchera pas s'il existe une contrainte cl
trangre entre le champ NumCom de la table ligneCommande et le champ
NumCom de la table commande.


24

Cours + Exercices sur Transact-SQL Pr H.LAARAJ
Lyce lissan eddine Ibn elkhatib laayoune BTS-DSI 2013 /2014
Create Trigger Tr_Empcher_Suppr
On Commande
For Delete
As
Declare @a int
set @a =(Select count(numart) from lignecommande, deleted
where lignecommande.numcom =deleted.numcom)
if (@a>0)
Begin
Raiserror('Opration annule. Une ou plusieurs commandes ont des articles
enregistrs',15,120)
Rollback
End



4. Le trigger suivant la suppression d'une ligne de commande, remet jour le stock
et vrifie s'il s'agit de la dernire ligne pour cette commande. Si c'est le cas la
commande est supprime :

Create Trigger Tr_Supprimer_Ligne
On LigneCommande
For Delete
As
Update article set QteEnStock = QteEnStock +
(select Sum(QteCommandee) from deleted
where article.NumArt=deleted.NumArt)
from article, deleted where deleted.numart=article.numart
Delete from commande where numcom not in (select numcom from lignecommande)


5. Le trigger suivant l'ajout d'une ligne de commande vrifie si les quantits sont
disponibles et met le stock jour

Create Trigger Tr_Ajouter_Ligne
On LigneCommande
For Insert
As
Declare @a int
set @a=(select count(numart) from inserted, article
where article.numart = inserted.numart
and QteCommandee >QteEnStock)
if (@a >0)
Begin
Raiserror('Ajout refus. Quantits demandes non disponibles en stock',15,120)
Rollback
End
Else
Update article set QteEnStock = QteEnStock
(select Sum(QteCommandee) from inserted where
article.NumArt=inserted.NumArt)
From article, inserted where inserted.numart=article.numart



25

Cours + Exercices sur Transact-SQL Pr H.LAARAJ
Lyce lissan eddine Ibn elkhatib laayoune BTS-DSI 2013 /2014

6. Le trigger suivant la modification d'une ligne de commande vrifie si les
quantits sont disponibles et met le stock jour

Create Trigger Tr_Modifier_Ligne
On LigneCommande
For Update
As
Declare @a int
set @a=(select count(numart) from inserted, deleted, article
where article.numart = inserted.numart
and article.numart = deleted.numart
and inserted.QteCommandee > QteEnStock+deleted.QteCommandee)
if (@a >0)
Begin
Raiserror(''Modification refuse. Quantits demandes non disponibles en stock',15,120)
Rollback
End
Else
update article set QteEnStock = QteEnStock
+ (select Sum(QteCommandee) from deleted where deleted.NumArt=Article.NumArt)
(select Sum(QteCommandee) from inserted where
inserted.NumArt=Article.NumArt)
From article, inserted, deleted
where inserted.numart = article.numart
and article.numart = deleted.numart



Remarque :
Si le trigger dclench effectue une opration sur une autre table, les triggers associs cette
table sont alors dclenchs (principe de cascade)
V.7 suppression dun dclencheur(Trigger)
Syntaxe :
Drop Trigger Nom_Trigger
V.8 modification dun dclencheur(Trigger)
Syntaxe :
Alter Trigger Nom_Trigger
On Nom_Table
For Opration1, Opration2...
as
Nouvelles Instructions


26

Cours + Exercices sur Transact-SQL Pr H.LAARAJ
Lyce lissan eddine Ibn elkhatib laayoune BTS-DSI 2013 /2014

VI les sries dexercices
VI.1 Exercices sur les procdures

Exercice P1
"Inter Dfils" est une socit d'organisation de dfils de modes. Une de ces activits
les plus rputes : Grand Dfil "Tradition Marocaine". Dans ce dfil, des costumes
dfilent devant un jury professionnel compos de plusieurs membres. Chaque membre
va attribuer une note chaque costume. La base de donnes a la structure suivante :

Crer les procdures stockes suivantes :
PS 1.. Qui affiche la liste des costumes avec pour chaque costume le numro, la
dsignation, le nom et l'adresse du styliste qui l'a ralis
PS 2.. Qui reoit un numro de costume et qui affiche la dsignation, le nom et
l'adresse du styliste concern
PS 3..
Qui reoit un numro de costume et qui affiche la liste des notes attribues avec pour
chaque note le numro du membre de jury qui l'a attribu, son nom, sa fonction et la
note.
PS 4.. Qui retourne le nombre total de costumes
PS 5.. Qui reoit un numro de costume et un numro de membre de jury et qui
retourne la note que ce membre a attribu ce costume
PS 6.. Qui reoit un numro de costume et qui retourne sa moyenne.

Exercice P2
Une socit achte ses fournisseurs des produits bruts qu'elle utilise dans la
fabrication de produits finis. On souhaite grer la composition et les mouvements de
stock de chaque produit fini.
Les Mouvements de stock sont les oprations d'entre ou de sortie (type=S ou type=E)
de produits finis vers ou depuis le magasin.
La base de donnes a la structure suivante :

27

Cours + Exercices sur Transact-SQL Pr H.LAARAJ
Lyce lissan eddine Ibn elkhatib laayoune BTS-DSI 2013 /2014

On suppose que les tables 'Mouvement', 'Produit Fini' et 'Fournisseur' sont cres.
Crer les procdures suivantes :
PS 1.. Qui cre les tables ProduitBrut et Composition
PS 2.. Qui affiche le nombre de produits bruts par produit Fini
PS 3.. Qui retourne en sortie le prix d'achat le plus lev
PS 4.. Qui affiche la liste des produits finis utilisant plus de deux produits bruts
PS 5.. Qui reoit le nom d'un produit brut et retourne en sortie la raison sociale de son
fournisseur
PS 6.. Qui reoit le code d'un produit fini et qui affiche la liste des mouvements de sortie pour
ce produit
PS 7.. Qui reoit le code d'un produit fini et le type de mouvement et qui affiche la liste des
mouvements de ce type pour ce produit fini
PS 8.. Qui pour chaque produit fini affiche :
La quantit en stock pour ce produit
La liste des mouvements concernant ce produit
La quantit totale en sortie et la quantit totale en entre
La diffrence sera compare la quantit en stock. Si elle correspond afficher 'Stock
Ok' sinon afficher 'Problme de Stock'
PS 9.. Qui reoit un code produit fini et retourne en sortie son prix de reviens
PS 10.. Qui affiche pour chaque produit fini :
Le prix de reviens (utiliser la procdure prcdente)
La liste des produits bruts le composant (nom, Mt, RSFour)
Le nombre de ces produits

Exercice P3
Soit la base de donnes suivante :



28

Cours + Exercices sur Transact-SQL Pr H.LAARAJ
Lyce lissan eddine Ibn elkhatib laayoune BTS-DSI 2013 /2014
Crer les procdures stockes suivantes :
PS 1.. Qui affiche les numros et les noms des stagiaires pour lesquels on a pas encore saisi
de note
PS 2.. Qui affiche les filires ayant plus de 10 modules au programme
PS 3.. SP_12 qui affiche les noms des modules qui sont tudis dans toutes les filires d'un
secteur donn en paramtre
PS 4.. Qui affiche pour un stagiaire donn en paramtre, la liste des notes (numro module,
nom du module, note et coefficient)
PS 5.. Qui affiche pour chaque stagiaire :
Le nom, le prnom et la filire sous la forme :
Nom et Prnom :.....Filire : .......
S'il existe des modules o le stagiaire n'a pas de notes attribue afficher le message 'En
cours de traitement' ainsi que la liste des modules o il n'a pas encore de notes'
S'il existe plus de deux modules o le stagiaire a obtenu une note <3 afficher 'Notes
Eliminatoires' et afficher les modules concerns
Sinon afficher la liste des modules (Module + Coefficients+note) ainsi que la moyenne
du stagiaire
Solutions
Solution dexercice P1 :
CREATE PROCEDURE PS1 AS
Select NumCostume, DesignationCostume, NomStyliste, AdrStyliste from
Styliste, Costume where Styliste.NumStyliste=Costume.NumStyliste
CREATE PROCEDURE PS2 @NumCos int AS
Select DesignationCostume, NomStyliste, AdrStyliste from Styliste,
Costume where Styliste.NumStyliste = Costume.NumStyliste and
NumCostume=@NumCos
CREATE PROCEDURE PS3 @NumCos int AS
Select MembreJury.NumMembreJury, NomMembreJury, FonctionMembreJury,
NoteAttribue from MembreJury, Notesjury where
MembreJury.numMembreJury= Notesjury.NumMembreJury and NumCostume
=@NumCos
CREATE PROCEDURE PS4 @NbrCos int output AS
Set @NbrCos=(select count(NumCostume) from Costume)
CREATE PROCEDURE PS5 @NumCos int, @MJ int , @note decimal output AS
Set @note=(select Noteattribue from Notesjury where NumCostume
=@NumCos and NumMembreJury=@MJ)
CREATE PROCEDURE PS6 @NumCos int , @M decimal output AS
Set @M=(select Avg(NoteAttribue) from Notesjury where
NumCostume =@NumCos)


Solution dexercice P2 :
CREATE PROCEDURE SP1 AS
Create table ProduitBrut(CodProBrut int primary key,NomProBrut
varchar(50), PrixAchat decimal, NumFour int Foreign Key references
Fournisseur)
Create table Composition (CodProFini int Foreign key references
ProduitFini, CodProBrut int Foreign Key references ProduitBrut,

29

Cours + Exercices sur Transact-SQL Pr H.LAARAJ
Lyce lissan eddine Ibn elkhatib laayoune BTS-DSI 2013 /2014
QteUtilisee decimal, Constraint PK_Composition Primary
Key(CodProFini, CodProBrut))
CREATE PROCEDURE SP2 AS
Select codProFini, count(CodProBrut) from composition Group by
CodProFini
CREATE PROCEDURE SP3 @MaxPrix decimal output AS
Set @MaxPrix =(Select max(PrixAchat) from ProduitBrut)
CREATE PROCEDURE SP4 AS
Select CodProFini from Composition Group by CodProFini
Having Count(CodProBrut)>=2
CREATE PROCEDURE SP5 @ProBrut varchar(50), @RS varchar(50) output
AS
Set @RS=(Select RSFour From Fournisseur, ProduitBrut
Where Fournisseur.NumFour= ProduitBrut.NumFour and
NomProBrut=@ProBrut)
CREATE PROCEDURE SP6 @CodProFini int AS
Select * from Mouvement Where TypeMvt='S' and CodProFini=@CodProFini
CREATE PROCEDURE SP7 @CodProFini int, @TypeMvt char(1) AS
Select * from Mouvement Where TypeMvt=@TypeMvt and
CodProFini=@CodProFini
CREATE PROCEDURE SP8 AS
Declare @CPF int, @QteStock decimal
Declare C1 Cursor for select CodProFini, QteEnStock from ProduitFini
open C1
Fetch next from C1 into @CPF, @QteStock
while @@fetch_status=0
Begin
Print 'La quantit en stock est :' + convert(varchar,
@QteStock)
Select * from Mouvement where CodProFini=@CPF
Declare @SommeE decimal, @SommeS decimal
Set @SommeE=(Select Sum(Quantite) from Mouvement where
TypeMvt="E" and CodProFini=@CPF)
Set @SommeS=(Select Sum(Quantite) from Mouvement where
TypeMvt="S" and CodProFini=@CPF)
if @SommeE-@SommeE <>@QteStock
Print 'Stock OK'
Else
Print 'Problme de Stock'
Fetch Next from C1 into @CPF, @QteStock
end
Close C1
Deallocate C1
CREATE PROCEDURE SP9 @CPF int, @PrixReviens decimal output AS
set @PrixReviens=(select Sum(PrixAchat*Qteutilisee) from ProduitBrut
PB, Composition C where C.CodProBrut=PB.CodProBrut and
CodProFini=@CPF)
CREATE PROCEDURE SP10 AS
Declare @CPF int, @NbrProduitsFinis int
Declare C1 Cursor for select CodProFini, count(CodproBrut) from
Composition group by CodProFini
Open C1
Fetch Next from C1 into @CPF, @NbrProduitsFinis
While @@fetch_status=0
Begin

30

Cours + Exercices sur Transact-SQL Pr H.LAARAJ
Lyce lissan eddine Ibn elkhatib laayoune BTS-DSI 2013 /2014
Declare @PR decimal
Exec SP9 @CPF, @PR output
Print 'Le prix de reviens est : ' + convert(varchar, @PR)
Select NomProFini, PrixAchat*Qteutilisee, RSFour From
ProduitBrut PB, Composition C Where
PB.CodProBrut=C.CodProBrut and CodProFini=@CPF
Print 'Le nombre de produits bruts est : ' +
convert(varchar,@NbrProduitsFinis)
Fetch Next from C1 into @CPF, @NbrProduitsFinis
End
Close C1
Deallocate C1


Solution dexercice P3 :
CREATE PROCEDURE SP1 AS
Select NumStagiaire, NomStagiaire From Stagiaire where NumStagiaire
not in (Select NumStagiaire from Notation, )
CREATE PROCEDURE SP2 AS
Select Filiere.NumFiliere, NomFiliere from filiere, programme
Where Filiere.numFiliere=Programme.Numfiliere
Group by Filiere.NumFiliere, NomFiliere
Having Count(NumModule)>=10
CREATE PROCEDURE SP3 @CodSecteur varchar(10) AS
Select NomModule from Module M,Programme P, Filiere F
Where M.Nummodule=P.numModule and P.NumFiliere=F.NumFiliere and
codSecteur=@CodSecteur
group by NomModule
Having count(F.numfiliere)=(select Count(numfiliere) from filiere
where CodSecteur=@CodSecteur)
CREATE PROCEDURE SP4 @NumStagiaire int AS
Select Module.NumModule, NomModule, Note,Coefficient from Module,
Notation, programme
Where Notation.NumModule=Module.NumModule and
Module.Nummodule=programme.Nummodule and numStagiaire=@NumStagiaire
CREATE PROCEDURE SP5 AS
Declare @NumSta int, @NomPreSta varchar(50), @NomFil varchar(50)
Declare C1 Cursor for Select NumStagiaire, NomStagiaire + ' ' +
PrenomStagiaire, NomFiliere from Stagiaire S, Filiere F where
S.NumFiliere=F.NumFiliere
Open C1
Fetch Next from C1 into @NumSta, @NomPreSta, @NomFil
while @@fetch_status=0
Begin
Print 'Nom et Prnom : ' + @NomPreSta + ' Filire : ' + @NomFil
if exists (select NumModule from Programme P, Stagiaire S
where P.NumFiliere=S.NumFiliere and NumStagiaire=@NumSta and
NumModule not in (select NumModule from notation where
NumStagiaire=@NumSta))
Begin
Print 'En cours de traitement'
select NumModule from Programme P, Stagiaire S where

31

Cours + Exercices sur Transact-SQL Pr H.LAARAJ
Lyce lissan eddine Ibn elkhatib laayoune BTS-DSI 2013 /2014


VI.2 Exercices sur les dclencheurs(Triggers)

Exercice T1
Soit la base de donnes Dfil cite dans lexerciceP1.

Crer les triggers suivants :
TR 1.. Qui, l'ajout de costumes dans la table Costume, vrifie si les numros de
stylistes concerns existent dans la table Styliste. Si ce n'est pas le cas annuler
l'opration d'ajout
TR 2.. Qui, la suppression de costumes, vrifie si des notes leur ont t attribues. Si
c'est le cas empcher la suppression
TR 3.. Qui, l'affectation de notes des costumes dans la table NotesJury, vrifie si
les costumes et les membres de jury existent et si les notes attribues sont comprises
entre 0 et 20
TR 4.. Qui l'ajout de membres jury, cherche si leurs fonctions existent dans la table
Fonction si ce n'est pas le cas il les rajoute


P.NumFiliere=S.NumFiliere and NumStagiaire=@NumSta and
NumModule not in (select NumModule from notation where
NumStagiaire=@NumSta)
Fetch Next from C1 into @NumSta, @NomPreSta, @NomFil
Continue
end
if (select count(NumModule) from notation where NumStagiaire
= @NumSta and note<3) >2
Begin
Print 'Notes Eliminatoires'
Select NomModule from Module M, Notation N where
M.NumModule=N.NumModule and numStagiaire=@NumSta and note <3
Fetch Next from C1 into @NumSta, @NomPreSta, @NomFil
Continue
End
Select NomModule, Coefficient, Note from Module M, Programme P,
Notation N, Stagiaire S where M.NumModule=P.NumModule and
P.numFiliere=S.NumFiliere and M.NumModule=N.NumModule and
N.NumStagiaire=S.NumStagiaire and S.numStagiaire=@NumSta
Select Sum(Note*coefficient) / Sum(coefficient) from Module M,
Programme P, Notation N, Stagiaire S where M.NumModule=P.NumModule
and P.numFiliere=S.NumFiliere and M.NumModule=N.NumModule and
N.NumStagiaire=S.NumStagiaire and S.numStagiaire=@NumSta
Fetch Next from C1 into @NumSta, @NomPreSta, @NomFil
End
Close C1
Deallocate C1

32

Cours + Exercices sur Transact-SQL Pr H.LAARAJ
Lyce lissan eddine Ibn elkhatib laayoune BTS-DSI 2013 /2014
Exercice T2
Soit la base de donnes GestionCompte suivante :

Les oprations consistent en des oprations de retrait ou de dpt d'argent (TypeOp=D si le
client a dpos de l'argent sur son compte et TypeOp=R si le client a retir de l'argent sur son
compte).
Un client ne peut avoir qu'un seul compte courant (TypeCpt="CC") et qu'un seul compte sur
carnet (TypeCpt="CN")
Le numro d'opration est automatique.
La date de l'opration prend par dfaut la date du jour.
Crer les triggers suivants ?
TR 1.. Qui l'ajout ou la modification de clients dans la table client vrifie si les Numros
de CIN saisies n'existent pas pour d'autres clients
TR 2.. Qui la cration de comptes, vrifie si :
Les soldes sont suprieurs 1500 DH ;
Les types de compte sont CC ou CN et aucune autre valeur n'est accepte ;
Les clients n'ont pas dj des comptes du mme type.
TR 3.. Qui interdit la suppression de comptes dont le solde est > 0 ou de comptes pour
lesquels la dernire opration date de moins de 3 mois mme s'ils sont vides (solde=0).
TR 4.. Qui :
Interdit la modification des numros de comptes ;
Interdit la modification du solde de comptes auxquels sont associes des oprations ;
Ne permet pas de faire passer des comptes sur carnet en comptes courants, le contraire
tant possible ;
TR 5.. A la modification de numros de clients vrifie si les nouveaux clients n'ont pas de
comptes associs du mme type.
Exercice T3
Soit la base de donnes stock cite dans lexerciceP2.
Crer les triggers suivants :
TR 1.. Qui l'ajout de produits bruts dans la table 'Produit Brut' met jour le champ
NbrProduitsfournis pour les fournisseurs concerns
TR 2.. Qui la suppression de produits bruts dans la table 'Produit Brut' met jour le champ
NbrProduitsfournis pour les fournisseurs concerns
TR 3.. Qui l'ajout de mouvements dans la table mouvement met jour le stock
TR 4.. Qui la suppression de mouvements dans la table mouvement met jour le stock
TR 5.. Qui la modification de mouvements dans la table mouvement met jour le stock

33

Cours + Exercices sur Transact-SQL Pr H.LAARAJ
Lyce lissan eddine Ibn elkhatib laayoune BTS-DSI 2013 /2014

Solutions
Solution dexercice T1 :
--Rappel : Les triggers After ne se dclenchent pas si les
contraintes d'intgrit ne sont pas valides
CREATE TRIGGER TR1 ON COSTUME INSTEAD OF INSERT AS
if not exists(select NumStyliste from inserted where NumStyliste
not in(select NumStyliste from styliste))
insert into Costume select * from inserted
CREATE TRIGGER TR1 ON COSTUME FOR INSERT AS
if exists(select NumStyliste from inserted where NumStyliste not
in(select NumStyliste from styliste))
Rollback
CREATE TRIGGER TR2 ON COSTUME FOR DELETE AS
if exists(select NumCostume from deleted where NumCostume in
(select NumCostume from notejury))
Rollback
CREATE TRIGGER TR2 ON COSTUME INSTEAD OF DELETE AS
if not exists(select NumCostume from deleted where NumCostume in
(select NumCostume from notejury))
Delete from Costume where NumCostume in (select NumCostume from
Deleted)
CREATE TRIGGER TR3 ON NOTEJURY FOR INSERT AS
If exists(select NumCostume from inserted where NumCostume not in
(select NumCostume from costume) or exists (select NumMemberJury
from inserted where NumMemberJury not in (select NumMembreJury from
MembreJury) or exists( select note from inserted where note not
between 0 and 20)
Rollback
CREATE TRIGGER TR3 ON NOTEJURY INSTEAD OF INSERT AS
If not exists(select NumCostume from inserted where NumCostume not
in (select NumCostume from costume) and not exists (select
NumMemberJury from inserted where NumMemberJury not in (select
NumMembreJury from MembreJury) and not exists( select note from
inserted where note not between 0 and 20)
Insert into NoteJury select * from inserted
CREATE TRIGGER TR4 ON MEMBREJURY FOR INSERT AS
insert into fonction select FonctionMembre from inserted where
fonctionMembre not in (select fonction from fonction)
Solution dexercice T2 :
CREATE TRIGGER TR1 ON CLIENT FOR INSERT, UPDATE AS
if exists (select CINCli from client group by CINCli Having
count(numcli)>1)
Rollback
CREATE TRIGGER TR1 ON CLIENT INSTEAD OF INSERT, UPDATE AS
if not exists (select CINCli from inserted where CINCli not in

34

Cours + Exercices sur Transact-SQL Pr H.LAARAJ
Lyce lissan eddine Ibn elkhatib laayoune BTS-DSI 2013 /2014
(Select CINCli from Client))
Begin
If (select Count(NumCli) from Deleted) =0)
Insert into client select * from inserted
Else
Update Client set Client.CINCli=I.CINCli, Client.NomCli=I.NomCli,
Client.AdrCli=I.AdrCli, Client.TelCli=I.TelCli where
Client.NumCli=I.NumCli and I.NumCli=D.NumCli From Inserted I Where
Client.NumCli=I.NumCli
End
CREATE TRIGGER TR2 ON COMPTE FOR INSERT AS
if exists(select NumCpt from inserted where SoldeCpt <1500) or
exists (select NumCpt from inserted where Typecpt <>'CC' and
TypeCpt <> 'CN') or exists(select inserted.numcli from
inserted,compte where inserted.numcli= compte.numcli and
compte.numcpt<>inserted.numcpt and compte.typecpt=inserted.typecpt)
Rollback
Ou Autre solution
if exists(select NumCpt from inserted where SoldeCpt <1500) or
exists (select NumCpt from inserted where Typecpt <>'CC' and
TypeCpt <> 'CN') or exists(select Numcli, TypeCpt from compte group
by NumCli, TypeCpt Having Count(NumCpt)>1)
Rollback
CREATE TRIGGER TR2 ON COMPTE INSTEAD OF INSERT AS
if not exists(select NumCpt from inserted where SoldeCpt <1500) and
not exists (select NumCpt from inserted where Typecpt <>'CC' and
TypeCpt <> 'CN') and not exists(select inserted.numcli from
inserted,compte where inserted.numcli= compte.numcli and
compte.typecpt=inserted.typecpt)
insert into compte select * from inserted
CREATE TRIGGER TR3 ON COMPTE FOR DELETE AS
if exists (select SoldeCpt from deleted where soldeCpt>0)
Rollback
if exists(select numcpt from operation group by numcpt Having
Datediff(month, max(dateOP), getdate())<3)
Rollback
CREATE TRIGGER TR4 ON COMPTE FOR UPDATE AS
if update(numcpt)
Rollback
if exists(select inserted.solde from inserted ,deleted ,operation
where inserted.numcpt=deleted.numcpt and
deleted.numcpt=operation.numcpt and deleted.solde<>inserted.solde )
Rollback
if exists(select inserted.numcpt from inserted ,deleted where
inserted.numcpt=deleted.numcpt and deleted.typecpt='cn' and
inserted.typecpt='cc')
Rollback
if exists(select inserted.numcli from inserted,compte where
inserted.numcli=compte.numcli and compte.numcpt<>inserted.numcpt
and compte.typecpt=inserted.typecpt )
Begin
Rollback
End

35

Cours + Exercices sur Transact-SQL Pr H.LAARAJ
Lyce lissan eddine Ibn elkhatib laayoune BTS-DSI 2013 /2014

Solution dexercice T3 :
CREATE TRIGGER TR1 ON PRODUITBRUT FOR INSERT AS
Update fournisseur set
NbrProduitsfournis=NbrProduitsfournis+(select count(Codprobrut)
from inserted where inserted.numfour= fournisseur.numfour)
from inserted,fournisseur where
inserted.numfour=fournisseur.numfour
CREATE TRIGGER TR2 ON PRODUITBRUT FOR DELETE AS
Update fournisseur set NbrProduitsfournis = NbrProduitsfournis -
(select count(Codprobrut) from deleted where
deleted.numfour=fournisseur.numfour)
From deleted, fournisseur
Where deleted.numfour=fournisseur.numfour
CREATE TRIGGER TR3 ON MOUVEMENT FOR INSERT AS
Update Produitfini set QteEnstock=QteEnstock+ (select Sum(Quantite)
from inserted where inserted.codprofini= produitfini.codprofini and
Typemvt='e')
from inserted,Produitfini
Where inserted.codprofini=produitfini.codprofini and Typemvt='e'
Update Produitfini set QteEnstock = QteEnstock -(select
sum(Quantite) from inserted where inserted.codprofini=
produitfini.codprofini and Typemvt='s')
From inserted,Produitfini
Where inserted.codprofini=produitfini.codprofini and Typemvt='s'
CREATE TRIGGER TR4 ON MOUVEMENT FOR DELETE AS
Update Produitfini set QteEnstock = QteEnstock -(select
sum(Quantite) from deleted where deleted.codprofini=
produitfini.codprofini and Typemvt='e')
From deleted,Produitfini
Where deleted.codprofini=produitfini.codprofini and Typemvt='e'
Update Produitfini set QteEnstock = QteEnstock +(select
sum(Quantite) from deleted where deleted.codprofini=
produitfini.codprofini and Typemvt='s')
From deleted,Produitfini
Where deleted.codprofini=produitfini.codprofini and Typemvt='s'
CREATE TRIGGER TR5 ON MOUVEMENT FOR UPDATE AS
Update Produitfini set QteEnstock = QteEnstock +(select
sum(Quantite) from deleted where
deleted.codprofini=produitfini.codprofini and deleted.typeop='s')-
(select sum(Quantite)from inserted where inserted.codprofini=
produitfini.codprofini and inserted.typeop='s')
From inserted ,Produitfini,deleted
Where inserted.codprofini=produitfini.codprofini and
deleted.codprofini= produitfini.codprofini and inserted.typeop='s'
and deleted.typeop='s'
update Produitfini set QteEnstock = QteEnstock -(select
sum(Quantite) from deleted where
deleted.codprofini=produitfini.codprofini and
deleted.typeop='e')+(select sum(Quantite)from inserted where

36

Cours + Exercices sur Transact-SQL Pr H.LAARAJ
Lyce lissan eddine Ibn elkhatib laayoune BTS-DSI 2013 /2014










inserted.codprofini= produitfini.codprofini and
inserted.typeop='e')
From inserted ,Produitfini,deleted
Where inserted.codprofini=produitfini.codprofini and
deleted.codprofini= produitfini.codprofini and inserted.typeop='e'
and deleted.typeop='e'
Update Produitfini set QteEnstock = QteEnstock +(select
sum(Quantite)from deleted where
deleted.codprofini=produitfini.codprofini and
deleted.typeop='e')+(select sum(Quantite)from inserted where
inserted.codprofini<> produitfini.codprofini and
inserted.typeop='s')
From inserted ,produitfini,deleted
Where inserted.codprofini=produitfini.codprofini and
deleted.numcmp=produitfini.numcpt and inserted.typeop='s' and
deleted.typeop='e'
Update Produitfini set QteEnstock = QteEnstock -(select
sum(Quantite)from deleted where
deleted.codprofini=produitfini.codprofini and deleted.typeop='s')-
(select sum(Quantite)from inserted where inserted.codprofini<>
produitfini.codprofini and inserted.typeop='e')
From inserted ,Produitfini,deleted
Where inserted.codprofini=produitfini.codprofini and
deleted.numcmp=produitfini.numcpt and inserted.typeop='e' and
deleted.typeop='s'

Bibliographie :
- Aide Transact-SQL partir de SQL Server
- Cours de SGBD Pr. Naoual ABDALLAH

Vous aimerez peut-être aussi