Questa settimana mi sono trovato davanti ad un nuovo (e curioso) problema con SQL:
Situazione:
Nel database di una nuova applicazione (su SQL 2005 SP2) ho bisogno di effettuare una query che metta in JOIN una tabella di un'altro server (SQL 2000 SP4). Fino a qui niente di strano.
Nelle clausole ON della JOIN (ma lo stesso risultato si ottiene utilizzando le WHERE della SELECT) esiste una controllo su un campo data del record. Devo in pratica effettuare la JOIN solo con l'ultimo record in ordine temporale della mia query remota. Per farvi capire, vi riporto un estratto del codice:
/* ... */
INNER JOIN [server_remoto].mio_database.dbo.tabella1 AS T1
ON T1.campo1 = D.campo4AND T1.campo2 = M.campo1 AND T1.campo3 = F.campo1
AND T1.data = (SELECT MAX(data)FROM [server_remoto].mio_database.dbo.tabella1
WHERE campo1 = T1.campo1AND campo2 = T1.campo2
AND campo3 = T1.campo3)
/* ... */
Una query comunque semplice. Peccato che mi venga restituito il seguente errore:
Msg 8180, Level 16, State 1, Line 1
Statement(s) could not be prepared.
Msg 107, Level 16, State 2, Line 1
The column prefix 'Tbl1007' does not match with a table name or alias name used in the query.
Msg 107, Level 16, State 2, Line 1
The column prefix 'Tbl1007' does not match with a table name or alias name used in the query.
Msg 107, Level 16, State 2, Line 1
The column prefix 'Tbl1007' does not match with a table name or alias name used in the query.
Andando a cercare informazioni su questo tipo di errore (incuriosito e spiazzato dal Tbl1007, l'alias generico/temporaneo che SQL utilizza quendo gli fa comodo) scopro che l'argomento è documentato in maniera un po' confusa...
Dopo un po' di ricerche trovo questo articolo:
http://support.microsoft.com/kb/936223/en-us
Richiedo l'hotfix (quello che aggiorna SQL 2005 SP2 alla versione 9.0.3175), lo ricevo, lo installo et voilà... il problema NON si risolve!
Credo che mi converrà tentare di "girare" la query in qualche modo (si accettano consigli).
E' comunque strano che un baco rilevato, documentato (anche se poco) e teoricamente corretto in un hotfix non venga minimamente modificato da quest'ultimo, non mi era mai capitato. L'articolo segnala anche un workaround che consiste nell'utilizzo di ODBC per la connessione al server SQL 2000. Impraticabile per l'ambiente di produzione sul quale dovrò portare l'applicazione, personalmente non l'ho testato (ma vi farò sapere).
Se avrò news in merito vi terrò aggiornati (sempre che non lo facciate voi per primi).
Notte...
Beh, se avete un cliente disposto a spendere qualche milione di dollari per i sui server, non potete non dare un'occhiata al sito del Transaction Processing Performance Council (http://www.tpc.org/).
E' veramente curioso vedere schede come questa, dove al fondo trovi persino il preventivo di Microsoft e gli screenshots degli ordini online delle SAN....
Che barboni... che saranno mai 64 licenze di SQL Server Enterprise Edition?