> Tech > Avec Dynamic SQL

Avec Dynamic SQL

Tech - Par Renaud ROSSET - Publié le 24 juin 2010
email

La procédure stockée procXTabDSQL, que montre le listing 4, utilise la vue vwSales2 et un curseur local qui se déplace en boucle dans une liste de noms de magasins pour générer une chaîne de requête crosstab. La chaîne de requête commence avec l'en-tête de ligne comme première colonne. La procédure

Avec Dynamic SQL

ouvre ensuite le curseur sur
la liste des noms de magasins. Le curseur
atteint les noms de magasins individuels
dans la variable @StoreName.
Chaque itération génère une chaîne
contenant une fonction SUM() qui entoure
une expression CASE, puis
concatène cette chaîne à  la variable
varchar @strSQL. Chaque fonction
SUM() génère une colonne de sortie
dans le rapport final.

L’expression CASE dans la première
fonction SUM() concerne la
colonne bookstore de Barnum du rapport.
SQL Server interprète l’apostrophe
de « Barnum’s » comme délimiteur
de la chaîne de comparaison et
essaie de comparer les données stockées
dans stor_name à  Barnum au lieu
de Barnum’s. Pour corriger ce problème,
le code doit remplacer le guillemet
simple dans le nom par deux
guillemets simples. Le premier
guillemet dans une suite doublesimple
-guillemet est considéré
comme le caractère d’échappement
pour le second guillemet ; il ordonne à  l’analyseur syntaxique de chaîne SQL
Server d’interpréter le second guillemet
comme un caractère et pas
comme un délimiteur de chaîne.
L’apostrophe dans le libellé de colonne
[Barnum’s] est acceptable parce que
c’est un libellé de colonne imbriqué
dans des crochets de colonne. Le listing
2 contient l’expression CASE correcte
pour la colonne Barnum’s du
rapport.

Les choses se compliquent quand
on essaie de générer cette requête SQL
à  partir d’une chaîne elle-même délimitée
par des guillemets simples. Il
faut fournir une séquence d’échappement
pour les guillemets simples qui
commencent et terminent la chaîne de
comparaison. La chaîne de comparaison
est contenue dans une variable,
donc il faut par programme remplacer
son guillemet simple par deux guillemets
simples en utilisant une fonction
REPLACE(). Malheureusement, la fonction
REPLACE() utilise aussi des guillemets
simples comme délimiteurs de
chaîne pour ses arguments string-literal.
Donc, pour remplacer un guillemet
simple par deux guillemets simples
dans la variable @StoreName, il faut
utiliser l’étrange syntaxe que voici

REPLACE(@StoreName,'''', '''''')

La valeur ASCII du guillemet
simple est 39. Pour améliorer la lisibilité
des expressions CASE dans le code
du listing 4, j’utilise sélectivement
CHAR(39) à  la place de certains des
guillemets simples.

Une fois que le code a fini son
circuit en boucle au travers des noms
de magasins, il concatène le reste de la
chaîne SQL à  la variable varchar. Quand
la chaîne SQL pour la requête crosstab
est terminée, le code appelle la procédure
EXECUTE pour générer l’ensemble
de résultats crosstab.

Téléchargez cette ressource

Guide inmac wstore pour l’équipement IT de l’entreprise

Guide inmac wstore pour l’équipement IT de l’entreprise

Découvrez toutes nos actualités à travers des interviews, avis d'experts et témoignages clients et ainsi, retrouvez les dernières tendances et solutions IT autour de nos 4 univers produits : Poste de travail, Affichage et collaboration, Impression et capture et Infrastructure.

Tech - Par Renaud ROSSET - Publié le 24 juin 2010