273
8.3 Optimisation du code SQL
variable de type VARCHAR, pour ensuite l’évaluer et l’exécuter dynamiquement à l’aide
du mot-clé EXEC(UTE). Par exemple :
DECLARE @sql varchar(8000)
SET @sql = 'SELECT * FROM Person.Contact'
EXEC (@sql)
Cette syntaxe particulière est fréquemment utilisée pour construire, à l’intérieur
de procédures stockées, des requêtes complexes, notamment pour permettre une
combinaison de multiples critères de recherches dans la clause WHERE. Imaginons le
cas d’un site web qui permet, dans une page de formulaire, d’effectuer une recherche
multicritères sur des produits. Chaque argument de recherche correspond à une
colonne, le tout sur une ou plusieurs tables de notre base. L’internaute peut saisir ou
non une valeur pour chaque argument. Une procédure stockée reçoit en paramètre
la liste des arguments, qu’elle utilise pour filtrer la requête. Il n’y a pratiquement que
deux choix : écrire une requête traditionnelle qui prend en compte tous les cas de
figure, comme ceci :
SELECT FirstName, MiddleName, LastName, Suffix, EmailAddress
FROM Person.Contact
WHERE
(LastName = @LastName OR @LastName IS NULL) AND
(FirstName = @FirstName OR @FirstName IS NULL) AND
(MiddleName = @MiddleName OR @MiddleName IS NULL) AND
(Suffix = @Suffix OR @Suffix IS NULL) AND
(EmailAddress = @EmailAddress OR @EmailAddress IS NULL)
ORDER BY LastName, FirstName
ou générer son code SQL de façon dynamique, avec une construction comme
celle-ci :
DECLARE @sql varchar(8000)
SET @sql = '
SELECT FirstName, MiddleName, LastName, Suffix, EmailAddress
FROM Person.Contact
WHERE '
IF @FirstName IS NOT NULL
SET @sql = @sql + ' FirstName = ''' + @FirstName + ''' AND '
IF @MiddleName IS NOT NULL
SET @sql = @sql + ' MiddleName = ''' + @MiddleName + ''' AND '
IF @LastName IS NOT NULL
SET @sql = @sql + ' LastName = ''' + @LastName + ''' AND '
IF @Suffix IS NOT NULL
SET @sql = @sql + ' Suffix = ''' + @Suffix + ''' AND '
IF @EmailAddress IS NOT NULL
SET @sql = @sql + ' EmailAddress = ''' + @EmailAddress + ''' AND '
SET @sql = LEFT(@sql, LEN(@sql)-3)
EXEC (@sql)
Le SQL dynamique a ses défauts : intégré dans une procédure stockée, il annule
en quelque sorte les avantages de précompilation de la procédure. En effet, la chaîne
8.3 Optimisation du code SQL
variable de type VARCHAR, pour ensuite l’évaluer et l’exécuter dynamiquement à l’aide
du mot-clé EXEC(UTE). Par exemple :
DECLARE @sql varchar(8000)
SET @sql = 'SELECT * FROM Person.Contact'
EXEC (@sql)
Cette syntaxe particulière est fréquemment utilisée pour construire, à l’intérieur
de procédures stockées, des requêtes complexes, notamment pour permettre une
combinaison de multiples critères de recherches dans la clause WHERE. Imaginons le
cas d’un site web qui permet, dans une page de formulaire, d’effectuer une recherche
multicritères sur des produits. Chaque argument de recherche correspond à une
colonne, le tout sur une ou plusieurs tables de notre base. L’internaute peut saisir ou
non une valeur pour chaque argument. Une procédure stockée reçoit en paramètre
la liste des arguments, qu’elle utilise pour filtrer la requête. Il n’y a pratiquement que
deux choix : écrire une requête traditionnelle qui prend en compte tous les cas de
figure, comme ceci :
SELECT FirstName, MiddleName, LastName, Suffix, EmailAddress
FROM Person.Contact
WHERE
(LastName = @LastName OR @LastName IS NULL) AND
(FirstName = @FirstName OR @FirstName IS NULL) AND
(MiddleName = @MiddleName OR @MiddleName IS NULL) AND
(Suffix = @Suffix OR @Suffix IS NULL) AND
(EmailAddress = @EmailAddress OR @EmailAddress IS NULL)
ORDER BY LastName, FirstName
ou générer son code SQL de façon dynamique, avec une construction comme
celle-ci :
DECLARE @sql varchar(8000)
SET @sql = '
SELECT FirstName, MiddleName, LastName, Suffix, EmailAddress
FROM Person.Contact
WHERE '
IF @FirstName IS NOT NULL
SET @sql = @sql + ' FirstName = ''' + @FirstName + ''' AND '
IF @MiddleName IS NOT NULL
SET @sql = @sql + ' MiddleName = ''' + @MiddleName + ''' AND '
IF @LastName IS NOT NULL
SET @sql = @sql + ' LastName = ''' + @LastName + ''' AND '
IF @Suffix IS NOT NULL
SET @sql = @sql + ' Suffix = ''' + @Suffix + ''' AND '
IF @EmailAddress IS NOT NULL
SET @sql = @sql + ' EmailAddress = ''' + @EmailAddress + ''' AND '
SET @sql = LEFT(@sql, LEN(@sql)-3)
EXEC (@sql)
Le SQL dynamique a ses défauts : intégré dans une procédure stockée, il annule
en quelque sorte les avantages de précompilation de la procédure. En effet, la chaîne
