# Microsoft SQL Server/Procédures stockées

* Introduction
* Bases de données
* Gestion des utilisateurs
* Variables
* Tables
* Procédures stockées
* Fonctions
* Bases de données spatiales
* Performances
* Importer et exporter
* SugarCRM

## Annexes

* Mots réservés
* Problèmes connus
* Introduction
* Bases de données
* Gestion des utilisateurs
* Variables
* Tables
* Procédures stockées
* Fonctions
* Bases de données spatiales
* Performances
* Importer et exporter
* SugarCRM

## Annexes

* Mots réservés
* Problèmes connus
[ Modifier le sommaire ]

## Introduction

Les procédures stockées sont des ensembles de requêtes SQL enregistrés dans les bases de données. Dans SSMS, on les trouve dans le menu du même nom à côté de celui des tables.
En effet, d'un point de vue de l'architecture logicielle d'une application, comme les longues suites de requêtes avec des structures de contrôles sont propres à leur SGBD, il est préférable de les grouper avec les données, pour permettre de passer d'un SGBD à l'autre sans redévelopper le module de formulaire d’interaction avec l'utilisateur (ex : un site Web peut ainsi passer de MySQL à MSSQL sans être repris intégralement, car il invoque une procédure stockée de même nom, avec les mêmes entrées et sorties, dans les deux SGBD).
Les procédures stockées servent généralement à manipuler les tables de la base où elles se trouvent, mais peuvent également interagir avec celles d'autres bases (dont les noms sont placés en préfixe) du même serveur, ou de serveurs liés. Pour créer un serveur lié dans SSMS, se rendre dans le menu "Objets serveur", puis "Serveurs liés", et remplir le compte à utiliser pour s'y connecter (ou utiliser sp_addlinkedserver où "sp" signifie "stored procedure").
Exemple de jointure entre deux serveurs :

## Syntaxe

Le langage T-SQL de Microsoft contient quelques améliorations par rapport à la norme SQL :
* Par défaut, les guillemets ont un rôle différent des apostrophes qui servent à créer des chaines de caractères. Pour les utiliser de la même façon (par exemple pour les imbriquer), il faut donc lancer SET QUOTED_IDENTIFIER ON.
* Dans SSMS, une requête SQL peut être exécutée de trois façons :
* Soit directement dans une fenêtre blanche apparaissant quand on clique sur "Nouvelle requête". On peut en sauvegarder le contenu en .sql, pour pouvoir la rouvrir plus tard.
* Soit en stockant la requête dans une variable chaine, avant d'exécuter cette dernière avec sp_executesql. Ce qui a l'avantage de pouvoir y incorporer des variables (ex : nom d'une base de données), mais l'inconvénient de supprimer la coloration syntaxique, l'autocomplétion (IntelliSense) et le débogage SSMS. Ex : DECLARE @Requete1 NVARCHAR(MAX) DECLARE @MaTable1 NVARCHAR(MAX) SET @MaTable1 = SET @Requete1 = 'SELECT * FROM ' + @MaTable1 EXECUTE sp_executesql @Requete1
* Soit en exécutant une procédure stockée dans une base de données (à côté des tables), dans laquelle on a enregistré une requête. Ex : EXEC [MaBase1].[dbo].[MaProcédure1]
Cet appel peut être suivi d'arguments, comme une procédure ou fonction en programmation impérative.
En effet, on en distingue deux sortes de variables dans les procédures stockées :
* Si elles le sont avec le mot Declare, elles sont privées.
* Sans ce mot, elles représentent les variables externes de la procédures, à préciser lors de son exécution :
Pour créer une nouvelle procédure stockée :
Pour enregistrer une procédure stockée existante, il faut exécuter :
Idéalement cette instruction sera présente au début de la procédure stockée suivie de AS, dont exécution aura donc pour effet de l'enregistrer (et pas d'en exécuter le contenu). Pour obtenir son résultat, il faut effectuer un clic droit dessus, puis choisir "Exécuter la procédure stockée..." : cela génère une autre requête SQL qui s'ouvre dans un nouvel onglet au-dessus du résultat, appelant la procédure stockée avec ses paramètres.
SSMS ne tolère pas qu'on sauvegarde une procédure stockée avec des erreurs de compilation. En cas de besoin il faut donc commenter le code en erreurs, ou passer par un fichier .sql (temporaire).
Les messages d'erreur communiquent un numéro de ligne décalé par rapport à celui numéroté par l'interface. Il faut y soustraire le nombre de lignes présentes avant le dernier GO.
Par la suite, ces procédures stockées peuvent ensuite être appelées dans des programmes dans des langages qui contiennent un pilote SQL Server, tels que PHP ou VB, qui en présenteront les résultats.

### PRINT

Cette commande affiche des caractères (variables ou constantes) dans l'onglet Messages, contrairement au SELECT qui remplit l'onglet Résultats.
Exemples :

### Conditions
#### CASE

Pour ajouter une condition WHERE uniquement si une valeur est présente, il faut que dans le cas contraire, la deuxième condition soit toujours vraie (ex : Champ1 = Champ1) :
À noter que l'exemple ci-dessus serait plus simple avec where Champ1 = isnull(@Colonne,Champ1).

### Boucles
#### WHILE

La boucle "while" utilise une condition pour s'arrêter, par exemple un compteur :

#### CURSOR

Un curseur permet de traiter un jeu d'enregistrements ligne par ligne, chacun étant stocké dans les variables suivant le INTO, et réinitialisé après le NEXT. Toutefois il est relativement lent et doit être remplacé par d'autres techniques quand c'est possible.
On peut par exemple ajouter des caractères sur certaines :

## Exécution de procédures depuis d'autres

Tout comme dans l'environnement de développement intégré Visual Basic, il existe un mode d'exécution pas à pas : en pressant F11 à chaque arrêt il est possible de suivre le lancement du programme, tout en surveillant les valeurs des variables en bas à gauche.
Les points d'arrêt sont également disponibles pour personnaliser les pas.
Toute modification de la procédure stockée pendant ce débogage s'affichera, mais ne sera pas pris en compte par le processus.
Pour exécuter une procédure stockée depuis une autre :

## Exceptions

Apparue avec SQL Server 2005, la gestion d'exceptions se présente ainsi :

## Recherches

Pour obtenir la liste des procédures stockées contenant une chaine particulière :

## Références

* ↑ https://msdn.microsoft.com/fr-fr/library/ms190479.aspx
* ↑ https://msdn.microsoft.com/en-us/library/ms188001.aspx?f=255&MSPPError=-2147217396
* ↑ https://msdn.microsoft.com/fr-fr/library/hcw1s69b.aspx?f=255&MSPPError=-2147217396
* ↑ http://msdn.microsoft.com/fr-fr/library/ms178642.aspx
* ↑ http://msdn.microsoft.com/fr-fr/library/ms180169.aspx
* ↑ http://sqlpro.developpez.com/cours/sqlserver/MSSQLServer-avoidCursor/