vendredi 21 août 2009
Dans SQL Server, dès le moment où j'ai découvert les procédures stockées, je n'ai plus jamais été capable de m'en passer. Imaginez deux applications, une basée web, l'autre un exécutable Windows. Plutôt que de coder la logique de l'application dans chaque instance, on la centralise directement dans la base de données. Poussées à l'extrême, les structures des applications consistent presque uniquement en des appels aux procédures.
Dans SQL Server, le langage utilisé pour coder des procédures porte le nom de T-SQL (pour Transact-SQL). La syntaxe de base est :
CREATE PROCEDURE dbo.proc_nameAu moment de l'appel, on s'y prend en préfixant le mot clé EXEC avant le nom de la procédure (sans parenthèses pour englober les arguments). Le terme "dbo" indique le database owner de l'objet.
-- paramètres ici
AS
-- code T-SQL ici
EXEC dbo.proc_name 1, 'test', 0Cette procédure prend 3 paramètres en entrée mais il existe un moyen pour les rendre optionnels. Ainsi, on pourrait aussi faire les appels suivants (il s'agit de la même fonction, contrairement à PostgreSQL qui permet des fonctions du même nom avec un nombre différent de paramètres) :
EXEC dbo.proc_name 1, 'test'Pour y arriver, on doit indiquer des valeurs par défaut au moment de déclarer les paramètres. Plutôt que d'avoir une définition comme celle-ci :
EXEC dbo.proc_name 1
-- et sans aucun paramètre
EXEC dbo.proc_name
CREATE PROCEDURE dbo.proc_nameOn remplacera l'entête par :
@param1 INT,
@param2 VARCHAR(50),
@param3 BIT
AS
PRINT @param1
PRINT @param2
PRINT @param3
GO
@param1 INT = 100,La fonction PRINT permet d'imprimer le contenu sans l'envoyer par la sortie standard (un recordset, le return value ou un output parameter).
@param2 VARCHAR(50) = 'Kaamelott',
@param3 BIT = 1
Mais que faire si dans certains cas, c'est le deuxième paramètre qu'on ne veut pas fournir ? Rien de plus simple, on utilisera le mot clé DEFAULT qu'on écrira à la position du paramètre qu'on veut utiliser la valeur par défaut (ici 'Kaamelott').
EXEC dbo.proc_name 77, DEFAULT, 0Dans le pire des cas, on pourrait sans doute faire ceci, même si ce n'est pas très utile :
EXEC dbo.proc_name DEFAULT, DEFAULT, DEFAULT