Scenario: C’è un problema su SQL 2005 e SQL 2008 dovuto alle funzionalità di compatibilità con SQL 2000. In SQL 2000 infatti era possibile inserire in una vista una clausola ORDER BY inserendo semplicemente una SELECT TOP 100 PERCENT nella sua definizione.
Ovviamente, essendo una cosa possibile se pure sconsigliata tutti noi l’abbiamo usata in modo massiccio :D, dopo l’SP2 o SP3 in SQL 2005 questa funzionalità disponibile per i database in modalità compatibilità SQL 2000, cessa di funzionare.
L’ho scoperto su un sistema di produzione presso un cliente, dove una piccola funzione sviluppata in VBA su Access, e usata dal 2001 ha improvvisamente cessato di funzionare lo scorso 15 ottobre.
C’è una Hot Fix (fatta dopo SP2 ma non inclusa in SP3) che risolve il problema disponibile qui, ma ovviamente è opportuno trovare tutti i posti in cui si usano queste Order By e provvedere a ordinare le Query dopo la vista anziché dentro la vista.
Dopo aver modificato il VBA Access per risolvere il problema contingente la domanda è stata:
Ma quante viste con una ORDER BY ho ancora in questo vecchio database? (Vecchio ma ovviamente pesantemente usato in quanto è il DB del Gestionale).
Aprire a mano 96 viste è una operazione da suicidio, quindi ho cercato in internet se c’è un modo per cercare dentro l’SQL di definizione degli oggetti di un database ed ho trovato in un forum su stack overflow quello che inserisco qui sotto, in caso serva a qualcun’altro:
SELECT v.name, m.definition FROM sys.views v INNER JOIN sys.sql_modules m ON v.object_ID = m.object_id WHERE m.definition LIKE '%TOP%'
Con questo script posso cercare tutte le definizioni di viste che contengono la parola TOP, ma è facilmente modificabile per cercare qualsiasi stringa in qualsiasi porzione di codice SQL relativo alla definizione di un oggetto in un database.
Grazie a Mark S.per averlo condiviso.
P.s. le viste da modificare sono 72 [sigh! :-((( ]