Abbiamo svolto molto lavoro simile al tuo esempio. Non ci preoccupiamo dell'ingiunzione di SQL, in parte perché abbiamo il controllo completo e totale sui dati che vengono sottoposti a pivot:semplicemente non è possibile che codice dannoso possa entrare attraverso ETL nel nostro data warehouse.
Alcuni pensieri e consigli:
- È necessario eseguire il pivot con le colonne nvarcahr(500)? I nostri sono varchar(25) o numerici, e sarebbe piuttosto difficile introdursi di nascosto codice dannoso.
- Che ne dici di controllare i dati? Sembra che se una di quelle stringhe contenesse un carattere "]", si tratta di un tentativo di hacking o di dati che ti esploderanno comunque.
- Quanto è solida la tua sicurezza? Il sistema è bloccato in modo tale che Malorey non possa intrufolarsi nel tuo database (direttamente o tramite la tua applicazione)?
Ah. Ci è voluto scrivere tutto per ricordare la funzione QUOTENAME(). Un rapido test sembrerebbe indicare che aggiungerlo al tuo codice in questo modo funzionerebbe (riceverai un errore, non una tabella temporanea eliminata):
SELECT
@columns =
STUFF
(
(
SELECT DISTINCT
', [' + quotename(ColumnB, ']') + ']'
FROM
#PivotTest
FOR XML PATH('')
), 1, 1, ''
)
Questo dovrebbe funzionare per le situazioni pivot (e unpivot), dal momento che devi quasi sempre [tra parentesi] i tuoi valori.