Hemos hecho mucho trabajo similar a su ejemplo. No nos hemos preocupado por la inyección de SQL, en parte porque tenemos un control completo y total sobre los datos que se pivotan:simplemente no hay forma de que el código malicioso pueda pasar a través de ETL a nuestro almacén de datos.
Algunas reflexiones y consejos:
- ¿Está obligado a pivotar con columnas nvarcahr(500)? Los nuestros son varchar(25) o numéricos, y sería bastante difícil colar código dañino a través de ellos.
- ¿Qué hay de la verificación de datos? Parece que si una de esas cadenas contenía un carácter "]", es un intento de pirateo o datos que explotarán de todos modos.
- ¿Qué tan robusta es su seguridad? ¿El sistema está bloqueado de tal manera que Malorey no puede infiltrar sus hacks en su base de datos (ya sea directamente o a través de su aplicación)?
Ja. Tomó escribir todo eso para recordar la función QUOTENAME(). Una prueba rápida parecería indicar que agregarlo a su código funcionaría (obtendrá un error, no una tabla temporal descartada):
SELECT
@columns =
STUFF
(
(
SELECT DISTINCT
', [' + quotename(ColumnB, ']') + ']'
FROM
#PivotTest
FOR XML PATH('')
), 1, 1, ''
)
Esto debería funcionar para situaciones de pivote (y no pivote), ya que casi siempre tiene que [entre paréntesis] sus valores.