> Tech > Avec Dynamic SQL

Avec Dynamic SQL

Tech - Par iTPro - 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 gratuitement cette ressource

Cybersécurité sous contrôle à 360°

Cybersécurité sous contrôle à 360°

Avec Cloud in One, les entreprises ne gagnent pas uniquement en agilité, en modernisation et en flexibilité. Elles gagnent également en sécurité et en résilience pour lutter efficacement contre l’accroissement en nombre et en intensité des cyberattaques. Découvrez l'axe Cybersécurité de la solution Cloud In One.

Tech - Par iTPro - Publié le 24 juin 2010