# Transact-SQL

Le Transact-SQL (T-SQL) est une extension propriétaire de Sybase et Microsoft au langage SQL. Transact-SQL a été développé à l'origine par la société Sybase, dès les premières versions de son moteur de base de données du même nom. De manière similaire au PL/SQL d'Oracle, Transact-SQL fournissait le moyen d'étendre les fonctionnalités de base du SGBD, via des programmes appelés "procédures stockées". Le code source comme compilé, est en effet stocké dans la base de données, par opposition aux programmes écrits en langage de programmation classique, dont le code source d'une part, le code compilé d'autre part, sont stockés dans des fichiers du système de fichiers.
Lorsque Microsoft a souhaité étendre son offre logicielle pour inclure un SGBD relationnel, il a passé des accords avec l'un des acteurs de l'époque, le challenger derrière principalement Oracle, RTI Ingres, Informix : Sybase. Le SGBD Sybase a été porté sur Windows. Microsoft a peu à peu acquis le savoir-faire en matière de SGBD relationnel, et développé son propre moteur de base de données, Microsoft SQL Server, à partir de la souche Sybase. Sybase de son côté a fait évoluer son SGBD, devenu depuis Adaptive Server Enterprise. Transact-SQL est ainsi aujourd'hui le langage de programmation associé à la fois aux SGBD Microsoft SQL Server et Sybase Adaptive Server Enterprise.
Par rapport au SQL, le T-SQL ajoute les fonctionnalités suivantes :
* Éléments de programmation procédurale (boucle, conditions...) ;
* La possibilité de créer et d'utiliser des variables locales ;
* Des fonctions de manipulations de chaîne de caractères, de dates et de calculs mathématiques.

## Programmation procédurale

Les principaux mots clefs permettant des instructions de programmation procédurale en Transact-SQL sont BEGIN et END, BREAK, CONTINUE, GOTO, IF et ELSE, RETURN, WAITFOR, et WHILE.
IF et ELSE permettent des exécutions conditionnelles. L'exemple ci-dessous va afficher "Nous sommes en week-end" si le jour J appartient au week-end, "Nous sommes en semaine" pour un jour de la semaine.
BEGIN et END délimitent un bloc d'instruction. Si plus d'une instruction est nécessaire dans un bloc conditionnel, il faut utiliser BEGIN et END :
WAITFOR va permettre de temporiser la procédure, en attendant un certain temps ou un moment précis de la journée.
RETURN est utilisé pour terminer immédiatement l'exécution d'une procédure stockée ou bien renvoyer le résultat d'une fonction.
BREAK va terminer le bloc d'une boucle WHILE, tandis que CONTINUE force l'exécution d'une nouvelle itération de la boucle.

## Opérateurs
### Opérateurs arithmétiques

Transact-SQL permet l'utilisation des opérateurs arithmétiques classiques.
* + (Addition)
* - (Soustraction)
* * (Multiplication)
* / (Division)
* % (Modulo)

### Opérateurs de comparaison

* = (Égal à)
* > (Supérieur à)
* < (Inférieur à)
* >= (Supérieur ou égal à)
* <= (Inférieur ou égal à)
* != (Différent de)
* <> (Différent de), non standardisé par l'ISO
* !< (Non inférieur à), non standardisé par l'ISO
* !> (Non supérieur à), non standardisé par l'ISO
* isnull

## Variables locales

Les variables locales sont souvent utilisées comme compteurs dans des boucles WHILE ou des blocs de types IF ... ELSE. Elles peuvent être utilisées dans des commandes ou dans des procédures stockées. La procédure utilise ces variables de manière automatique et non-interactive lorsqu'elle est exécutée. Les variables locales peuvent être utilisées partout où la syntaxe de Transact-SQL exige l'utilisation d'une expression.

### Déclaration

La déclaration de variables locales est similaire à celle de langages impératifs classiques. Elle suit la syntaxe suivante :
Exemples :
OU
La deuxième syntaxe est plus efficace en termes de mémoire et de performance.

### Utilisation dans des sous-routines

Une sous-routine assignant une valeur à une variable locale ne doit retourner qu'une seule valeur.
Exemples :

### Valeur NULL

Les variables locales ont initialement pour valeur NULL lorsqu'elles sont déclarées. Elles peuvent également recevoir la valeur NULL d'une commande SELECT. NULL étant une valeur spéciale, la comparaison entre des variables de valeur NULL et d'autres valeurs NULL doit suivre des règles particulières qui sont résumées dans le tableau ci-dessous. Une expression peut être une variable, une constante, ou une combinaison des deux contenant des opérateurs arithmétiques.
Comparaisons entre valeurs NULL :
| Type de Comparaison | Opérateur = | Opérateurs <, >, <=, !=, !<, !>, <> |
| Comparaison entre deux colonnes de valeur NULL | FALSE | FALSE |
| Comparaison entre colonne de valeur NULL et expression NULL | FALSE | FALSE |
| Comparaison entre expression NULL et colonne de valeur NULL | FALSE | FALSE |
| Comparaison entre deux expressions NULL | TRUE | FALSE |

## DELETE et UPDATE

Le Transact-SQL permet d'ajouter une clause FROM aux opérations DELETE et UPDATE, permettant la jointure de tables.
L'exemple ci-dessous va effacer de la table utilisateur ceux qui ont le drapeau "En attente".