espacios finales no siempre son ignorados. Experimenté este problema hoy. Mi mesa tenía columnas NCHAR y se estaba uniendo a los datos de VARCHAR. Como los datos en la tabla no eran tan amplios como su campo, SQL Server agregó automáticamente espacios finales.
Tenía una ITVF (función en línea con valores de tabla) que tomaba varios parámetros. Los parámetros se usaron en un JOIN a la tabla con los campos NCHAR.
Las uniones fallaron porque los datos pasados a la función no tenían espacios finales pero sí los datos en la tabla. ¿Por qué fue eso?
Me estaba tropezando con DATA TYPE PRECEDENCE. (Ver http://technet.microsoft.com/en-us/library/ms190309.aspx)
Al comparar cadenas de diferentes tipos, el tipo de precedencia inferior se convierte en el mayor Tipo de precedencia antes de la comparación. Entonces mis parámetros VARCHAR se convirtieron a NCHAR. Los NCHARs fueron comparados, y aparentemente los espacios fueron significativos.
¿Cómo solucioné esto? Cambié la definición de la función para usar los parámetros de NVARCHAR, que son de una precedencia más alta que NCHAR. Ahora los NCHAR se cambiaron automáticamente por SQL Server en NVARCHAR y los espacios finales se ignoraron.
¿Por qué no acabo de realizar un RTRIM? Las pruebas revelaron que RTRIM eliminó el rendimiento, impidiendo las optimizaciones de JOIN que de otra forma hubiera utilizado SQL Server.
¿Por qué no cambiar el tipo de datos de la tabla? Las tablas ya están instaladas en los sitios de los clientes, y no quieren ejecutar scripts de mantenimiento (tiempo + dinero para pagar DBA) ni darnos acceso a sus máquinas (comprensible).
Creo 'WHERE ZoneReference = 'WF11XU' Y DATALENGTH (ZoneReference) = DATALENGTH ('WF11XU')' también funcionará y podría ser más rápido que 'LIKE' – a1ex07
@MarkByers Sí veo - Intenté' donde 'WF11XU' como ZoneReference' ¡y funcionó! Más raro y más extraño. Aún así, ¡todos los días son día de escuela! –