spazi finali non sono sempre ignorati. Ho riscontrato questo problema oggi. La mia tabella aveva colonne NCHAR e veniva aggiunta ai dati VARCHAR. Poiché i dati nella tabella non erano ampi come il relativo campo, gli spazi finali venivano aggiunti automaticamente da SQL Server.
Avevo un ITVF (funzione con valori di tabella inline) che utilizzava parametri varchar. I parametri sono stati utilizzati in un JOIN alla tabella con i campi NCHAR.
I join non sono riusciti perché i dati passati alla funzione non avevano spazi finali ma i dati nella tabella. Perché era quello?
Mi stavo incastrando su PRECEDENZA DI TIPO DI DATI. (Vedi http://technet.microsoft.com/en-us/library/ms190309.aspx)
Quando si confrontano stringhe di tipi diversi, il tipo di precedenza inferiore viene convertito nel tipo di precedenza più alta prima del confronto. Quindi i miei parametri VARCHAR sono stati convertiti in NCHAR. I NCHAR sono stati confrontati e apparentemente gli spazi erano significativi.
Come ho risolto questo problema? Ho modificato la definizione della funzione per utilizzare i parametri NVARCHAR, che hanno una precedenza più alta di NCHAR. Ora gli NCHAR sono stati modificati automaticamente da SQL Server in NVARCHAR e gli spazi finali sono stati ignorati.
Perché non ho appena eseguito un RTRIM? I test hanno rivelato che RTRIM ha ucciso le prestazioni, impedendo le ottimizzazioni JOIN che altrimenti avrebbe utilizzato SQL Server.
Perché non modificare il tipo di dati della tabella? Le tabelle sono già installate sui siti dei clienti e non vogliono eseguire script di manutenzione (tempo + denaro per pagare i DBA) o darci accesso alle loro macchine (comprensibili).
fonte
2013-11-11 17:54:17
Credo che WHERE ZoneReference = 'WF11XU' E DATALENGTH (ZoneReference) = DATALENGTH ('WF11XU') 'funzionerà anche e potrebbe essere più veloce di' LIKE' – a1ex07
@MarkByers Sì, vedo - Ho provato 'dove 'WF11XU' come ZoneReference' e questo ha funzionato! Più strano e più strano. Comunque, ogni giorno è un giorno di scuola! –