Wykonaliśmy dużo pracy podobnej do twojego przykładu. Nie martwiliśmy się wstrzykiwaniem SQL, po części dlatego, że mamy pełną i całkowitą kontrolę nad zmienianymi danymi — po prostu nie ma możliwości, by złośliwy kod przedostał się przez ETL do naszej hurtowni danych.
Kilka przemyśleń i porad:
- Czy wymagane jest przestawianie z kolumnami nvarcahr(500)? Nasze to varchar(25) lub numeryczne i byłoby dość trudno przemycić przez nie szkodliwy kod.
- Co powiesz na sprawdzanie danych? Wygląda na to, że jeśli jeden z tych ciągów zawiera znak „]”, to albo próba włamania, albo dane, które i tak na ciebie wysadzą.
- Jak solidne są Twoje zabezpieczenia? Czy system jest zablokowany tak, że Malorey nie może przemycić swoich hacków do Twojej bazy danych (bezpośrednio lub przez Twoją aplikację)?
Ha. Trzeba było napisać to wszystko, aby zapamiętać funkcję NAZWA WYCENA(). Szybki test wydaje się wskazywać, że dodanie go do kodu w ten sposób zadziała (otrzymasz błąd, a nie upuszczoną tabelę tymczasową):
SELECT
@columns =
STUFF
(
(
SELECT DISTINCT
', [' + quotename(ColumnB, ']') + ']'
FROM
#PivotTest
FOR XML PATH('')
), 1, 1, ''
)
Powinno to działać w sytuacjach obrotowych (i unpivot), ponieważ prawie zawsze musisz [w nawiasach] swoje wartości.