TRANSACT-SQL
TRANSACT-SQL
Transact SQL est un langage procdural (par opposition
SQL qui est un langage dclaratif) qui permet de programmer des algorithmes de traitement des donnes au sein des SGBDR Sybase Adaptive Server et Microsoft SQL Server. Il a t cr par Sybase INC. la fin des annes 80 pour rpondre aux besoins d'extension de la programmation des bases de donnes pour son SGBDR. Ce langage est donc commun aux deux produits (MS SQL Server et Sybase Adaptive) avec des diffrences mineures dans les implmentations. Il sert programmer des procdures stockes et des triggers (dclencheurs).
Dclaration d'une Variable:
Pour dclarer une variable, utilisez le mot cl
DECLARE en utilisant la formule suivante : DECLARE Options Noms de variables:
Variable locale:
DECLARE @VariableName DataType; Variable globale: DECLARE @@VariableName DataType; Dclaration multiples: DECLARE @Variable1 DataType1, @Variable2 DataType2, @Variable_n DataType_n;
Les rgles de codage des variables
ne peuvent dpasser 128 caractres.
Ils doivent commencer par une lettre ou un
"underscore". Les caractres spciaux et le blanc ne sont pas admis. On se contentera d'utiliser les 37 caractres de base : ['A'..'Z', '0'..'9', '_'] La casse n'a pas d'importance.
Types de donnes
Type de donnes
Table : Type de donnes spcial qui permet de stocker
un jeu de rsultats pour un traitement ultrieur. Son utilisation principale concerne le stockage temporaire d'un ensemble de lignes, qui doivent tre renvoyes sous forme de jeu de rsultats d'une fonction table. Une variable de type table se comporte comme une variable locale. Elle possde une porte bien dfinie, qui reprsente la fonction, la procdure stocke ou le lot d'instructions dans lequel elle est dclare.
Initialisation d' une Variable
La formule utilise est la suivante : SELECT @VariableName = DesiredValue ou SET @VariableName = DesiredValue Initialisation multiple: avec Select seulement
select @i=3,@j=4,@str='TSDI
Affichage des valeurs
Ds qu'une variable a t initialise, vous pouvez
rendre sa valeur disponible ou l'afficher selon deux sorties:
Affichage Table avec SELECT:
Select @i
Affichage Message avec PRINT:
Print Chaine de caractre
Exemple
DECLARE @FirstName nvarchar(20), @LastName nvarchar(20), @FullName nvarchar(40), @DateHired date, @EmplStatus int,
@IsMarried bit, @WeeklyHours decimal(6,2), @HourlySalary SmallMoney, @WeeklySalary SmallMoney; SET @FirstName = N'Samuel'; SET @LastName = N'Weinberg'; SET @FullName = @LastName + N', ' + @FirstName; SET @DateHired = N'12/05/1998'; SET @IsMarried = 1; SET @EmplStatus = 2; SET @WeeklyHours = 36.50; SET @HourlySalary = 15.72; SET @WeeklySalary = @WeeklyHours * @HourlySalary; SELECT @FullName As [Full Name], @DateHired AS [Date Hired], @EmplStatus AS [Empl Status], @IsMarried AS [Married?], @WeeklyHours AS Hours, @HourlySalary AS Hourly, @WeeklySalary AS Weekly;
Exemple de variable de type table :
Declare @stg table(numInsc int primary key, nom varchar(20), prenom varchar(20),moyenne numeric(4,2)) /*la particularit des variables de type table, est quon peut utiliser des commandes insert, select,update, delete */ insert into @stg values(103,'LAAROUSSI','SALAH',14) insert into @stg values(107,'AADISSA','Youness',14.5) insert into @stg values(200,'SOQRAT','Sanaa',12.5) select * from @stg
Bloc dinstructions
Un bloc dinstruction est un ensemble dinstruction T-
SQL qui sont considr comme un tout ( une seule). Un bloc dinstruction peut contenir dautres sous blocs.
Begin --instruction(1) --instruction(2) --instruction(N) end
Instructions conditionnelles
Si une condition est True:
IF [NOT] condition instruction[ELSE instruction]
Exemple: DECLARE @DateEmbauche datetime, @CurrentDate datetime SET @DateEmbauche = '04/10/2010 ' SET @CurrentDate = ' 11/04/2011 ' IF @DateEmbauche < @CurrentDate PRINT 'Exprience exige' ELSE PRINT 'Bienvenue';
Instructions conditionnelles
IF [NOT] EXISTS(requte select) instruction [ELSE instruction]
Exemple2:
if exists ( select * from pilote where ville = 'tanger') print 'il exist des pilotes tangerois' else print 'aucun pilote nest tangerois'
Instructions conditionnelles
CASE: La fonction CASE est une expression Transact-
QL spciale qui permet l'affichage d'une valeur de remplacement en fonction de la Valeur d'une colonne. Ce changement est temporaire. Par consquent, aucune Modification permanente n'est apporte aux donnes. Syntaxe:
CASE expression WHEN valeur1 THEN rsultats WHEN Value2 THEN rsultats WHEN Value_n THEN rsultats END
Instructions conditionnelles
Exemple:
SELECT marque,capacite, CASE WHEN capacite<=400 THEN 'Petit avion' WHEN capacite<600 and capacite>=400 THEN 'Avion Moyen' WHEN capacite>=600 THEN 'Grand Avion' END AS 'Comentaire' FROM avion ORDER BY capacite
Instructions itrative
WHILE condition instruction
DECLARE @Numro As int SET @numro = 1 WHILE @numro < 5 BEGIN SELECT @ numro as numro SET @ numro = @numro + 1 END
Fonctions utilisateur
Les fonctions utilisateurs sont de trois types. Il y a les
fonctions scalaires, les fonctions tables en ligne et les fonctions multi-instructions. Une fonction peu accepter des arguments, et ne peu retourner que deux types de donnes : une valeur scalaire ou une table. Le champ daction dune fonction est vraiment limit puisquil nest possible de modifier que des objets locaux la fonction. Il nest pas possible de modifier des objets de la base, contenus lextrieur de la fonction.
Cration dune fonction
partir de lexplorateur dobjets:
Avec du code:
CREATE FUNCTION FunctionName ()
Type de retour dune fonction
Pour qu'une fonction soit utile, elle doit produire un
rsultat. Lors de la cration d'une fonction, vous devez spcifier le type de valeur que la fonction renverrait. Pour fournir cette information, aprs le nom de la fonction, tapez le mot-cl RETURNS suivi d'une dfinition pour un type de donnes. Voici un exemple simple :
CREATE FUNCTION Addition() RETURNS Decimal(6,3)
CORPS DE LA FONCTION
Le corps d'une fonction commence
par BEGIN et se termine avec les mots-cls END. END Entre les mots-cls BEGIN et END, qui est la section qui reprsente le corps de la fonction, vous pouvez dfinir l'affectation que doit excuter la fonction. Aprs l'excution de cette affectation, juste avant le mot-cl END, vous devez spcifier la valeur renvoye par la fonction.
CREATE FUNCTION Addition() RETURNS Decimal(6,3) [AS] BEGIN
La valeur de retour
La valeur renvoye par la fonction est faite en tapant le
mot-cl RETURN, suivi d'une expression. La formule est la suivante :
CREATE FUNCTION Addition() RETURNS Decimal(6,3) AS BEGIN RETURN expression END
Appel d'une fonction
Pour appeler une fonction, vous devez qualifier son
nom. Pour le faire, saisissez le nom de la base de donnes dans laquelle il a t cr, suivi du schma dbo , suivi du nom de la fonction et ses parenthses. La formule utiliser est la suivante : On utilise PRINT ou SELECT pour afficher la valeur de la fonction dans une fentre de requte:
DatabaseName .dbo. FunctionName ()
Exemple
Exemple
CREATE FUNCTION Addition() RETURNS int BEGIN DECLARE @Number1 int SET @Numro1 = 588 RETURN @Number1 + 1450 END
Appel de fonction:
Select [Link]() as addition
Une fonction paramtre
Afin de remplir ses missions, une fonction peut tre
fournie avec certaines valeurs. Une valeur externe qui est fournie une fonction est appele un paramtre. Une fonction peut galement prendre plusieurs paramtres. Dans le corps de la fonction, vous pouvez utiliser les paramtres comme si vous connaissiez dj leur valeur.
CREATE FUNCTION Addition(@Number1 Decimal(6,2), @Number2 Decimal(6,2))
Exemple
CREATE FUNCTION Addition(@Number1 Decimal(6,2), @Number2 Decimal(6,2)) RETURNS Decimal(6,2) BEGIN DECLARE @Result Decimal(6,2) SET @Result = @Number1 + @Number2 RETURN @Result END;
PRINT [Link](1450, 228) ;
Exemples:
Ecrire une fonction qui accepte en paramtre une
marque davion et qui retourne le nombre davions de cette marque.
create function nbreAvion(@marque varchar(20)) returns int as begin declare @nbre int select @nbre = count(*) from avion where marque = @marque return @nbre end
Exemple
Ecrire une fonction qui retourne la liste des pilotes qui ont vol
Paris.
create function PiloteParis() returns @tbl table( num int , nom varchar(20) ) as begin insert into @tbl(num,nom) select pil# , nom from pilote left join vol on [Link]# = [Link] where villearrivee = 'casa' Return end create function PiloteParis() Returns table as Return select pil# , nom from pilote left join vol on [Link]# = [Link] where villearrivee = 'casa;
Rq: Etant donn que cette fonction ne contient qu'une seule
instruction, il est possible de la dfinir de la faon suivante:
Types de fonctions
Le type de fonction change selon son type de retour: Fonction scalaire: retourne une valeur scalaire
RETURNS return_data_type [ AS ] BEGIN function_body RETURN scalar_expression END [ ; ]
Fonction Table : retourne une table qui est le rsultat dune
instruction SELECT.
Fonction en ligne
RETURNS TABLE [ AS ] RETURN [ ( ] select_stmt [ ) ] [ ; ]
Fonction multi-instructions
RETURNS @return_variable TABLE < table_type_definition > [ AS ] BEGIN function_body RETURN END [ ; ]
Les curseurs- dfinition
Dans SQL Server, un curseur est un objet qui nous
permet dexcuter un traitement sur un ensemble denregistrements. Les curseurs sont des outils trs puissants, mais aussi trs gourmands en ce qui concerne les ressources. Il est donc conseill de modifier des lignes de rsultat de manire traditionnelle, avec un simple UPDATE ou une autre instruction du DML, afin de consommer le moins de ressources possibles.
Dclaration des curseurs
DECLARE cursor_name CURSOR FOR select_statement
cursor_name : Nom du curseur de serveur Transact-
SQL dfini. select_statement : Instruction SELECT standard qui dfinit le jeu de rsultats du curseur.
Les curseurs
OPEN: Cette instruction permet de remplir le curseur
par le jeu de rsultat de SELECT et le rendre ainsi utilisable.
Syntaxe:
OPEN Cursor-name
FETCH: Cest linstruction qui permet dextraire une
ligne du curseur et de valoriser les variables et leur contenu. @@FETCH_STATUS : cest une variable globale qui tablit un rapport d'tat de la dernire instruction FETCH: Si lexcution du FECTCH sest bien passe , la variable globale @@FETCH_STATUS est 0.
Les curseurs
Syntaxe:
FETCH (arguments) Nom_Curseur INTO Liste_Variable
Arguments: NEXT: Lit la ligne suivante. PRIOR: Lit la ligne prcdente. FIRST: Lit la premire ligne. LAST: Lit la dernire ligne. ABSOLUTE p: Lit la Pime ligne de lensemble. RELATIVE p: avance de p position (si n ngatif recule de p position) Liste_Variable: autant de variable que de colonne dans lordre SELECT
Les curseurs
CLOSE: Cette instruction permet la fermeture du
curseur et la libration de la place mmoire o il t contenu. Il est important de faire intervenir cette opration ds que possible dans le souci de librer les ressources.
Syntaxe:
CLOSE Nom_Curseur
DEALLOCATE : Cette instruction permet de
supprimer le curseur et les ressources associes.
Syntaxe:
DEALLOCATE Nom_Curseur
Exemple
Soit la table avion:
Afficher les marques des avions avec leur types sous le
forme suivante:
Marque : AIRBUS - Type: A Marque : Airbus - Type: civile Marque : Boeing - Type: civile Marque : F5 - Type: militaire Marque : TEST - Type: T
Declare @Marque varchar(20), @type varchar(20) DECLARE Avion_cursor CURSOR FOR SELECT distinct (marque), typeAvion FROM Avion OPEN Avion_cursor FETCH NEXT FROM Avion_cursor INTO @marque, @type While @@FETCH_STATUS=0 begin print 'Marque : ' + @Marque + ' - Type: ' + @type FETCH NEXT FROM Avion_cursor INTO @Marque, @type End CLOSE Avion_cursor DEALLOCATE Avion_cursor GO
Exemple
Afficher les marques des avions avec leur types sous le
forme suivante:
Marque : AIRBUS Type : -A - civile Marque : Boeing Type : - civile Marque : F5 Type : - militaire Marque : TEST Type : -T
Declare @Marque varchar(20), @type varchar(20) DECLARE Avion_cursor CURSOR FOR SELECT distinct (marque) FROM Avion OPEN Avion_cursor FETCH NEXT FROM Avion_cursor INTO @marque While @@FETCH_STATUS=0 begin print 'Marque : ' + @Marque print ' Type :' DECLARE Type_cursor CURSOR FOR SELECT DISTINCT typeAvion From Avion where marque = @marque OPEN Type_cursor FETCH NEXT FROM Type_cursor INTO @type while @@fetch_status=0 begin print ' - ' + @type FETCH NEXT FROM Type_cursor INTO @type end CLOSE type_cursor DEALLOCATE type_cursor FETCH NEXT FROM Avion_cursor INTO @Marque End CLOSE Avion_cursor DEALLOCATE Avion_cursor