Nous avons fait beaucoup de travail similaire à votre exemple. Nous ne nous sommes pas inquiétés de l'injonction SQL, en partie parce que nous avons un contrôle complet et total sur les données en cours de pivotement :il est tout simplement impossible qu'un code malveillant puisse passer par ETL dans notre entrepôt de données.
Quelques réflexions et conseils :
- Êtes-vous obligé de pivoter avec des colonnes nvarcahr(500) ? Les nôtres sont varchar(25) ou numériques, et il serait assez difficile d'y glisser du code dommageable.
- Qu'en est-il de la vérification des données ? Il semble que si l'une de ces chaînes contenait un caractère "]", c'est soit une tentative de piratage, soit des données qui exploseront de toute façon.
- Quelle est la robustesse de votre sécurité ? Le système est-il verrouillé de manière à ce que Malorey ne puisse pas se faufiler dans votre base de données (soit directement, soit via votre application) ?
Ha. Il a fallu écrire tout cela pour se souvenir de la fonction QUOTENAME(). Un test rapide semblerait indiquer que l'ajouter à votre code comme cela fonctionnerait (vous obtiendrez une erreur, pas une table temporaire abandonnée) :
SELECT
@columns =
STUFF
(
(
SELECT DISTINCT
', [' + quotename(ColumnB, ']') + ']'
FROM
#PivotTest
FOR XML PATH('')
), 1, 1, ''
)
Cela devrait fonctionner pour les situations de pivot (et non pivot), puisque vous devez presque toujours [mettre entre parenthèses] vos valeurs.