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

État des lieux de la réponse à incident de cybersécurité
Les experts de Palo Alto Networks, Unit 42 et Forrester Research livrent dans ce webinaire exclusif leurs éclairages et stratégies en matière de réponses aux incidents. Bénéficiez d'un panorama complet du paysage actuel de la réponse aux incidents et de sa relation avec la continuité de l'activité, des défis auxquels font face les entreprises et des tendances majeures qui modèlent ce domaine. Un état des lieux précieux pour les décideurs et professionnels IT.
Les articles les plus consultés
Les plus consultés sur iTPro.fr
- De la 5G à la 6G : la France se positionne pour dominer les réseaux du futur
- Datanexions, acteur clé de la transformation numérique data-centric
- Les PME attendent un meilleur accès aux données d’émissions de la part des fournisseurs
- Fraude & IA : Dr Jekyll vs. Mr Hyde, qui l’emporte ?
- Gestion du cycle de vie des outils de cyberdéfense : un levier de performance pour les entreprises
