Pregunta

Cuando intento esta consulta ad-hoc en SQL Server (suponiendo UserId es un campo NVARCHAR):

SELECT * FROM MyUser WHERE UserId = 123456

Me sale este error:

Msg 245, Level 16, State 1, Line 1
Syntax error converting the nvarchar value 'foo' to a column of data type int.

Es evidente que hay un valor 'foo' algún lugar abajo de mi columna UserId.

¿Por qué es SQL Server tratando de convertir toda mi columna a INTEGER en lugar de hacer lo que me parece evidente: convertir el valor de mi búsqueda en NVARCHAR

¿Fue útil?

Solución

La comparación se realiza utilizando las reglas de Tipo de datos Precedencia :

  

Cuando un operador combina dos   expresiones de diferentes tipos de datos,   las reglas de tipo de datos precedencia   especifican que el tipo de datos con el   precedencia inferior se convierte en el   tipo de datos con la prioridad más alta.

El tipo NVARCHAR (precedencia 25) se convierte en int (precedencia 16). Tenga en cuenta que 1 significa prioridad más alta ''.

Otros consejos

creo que esto se debe a que no se puede comparar dos valores de diferentes tipos. Entonces, se tiene que convertir cualquiera de los miembros comparsion igualdad al mismo tipo. En este caso, se prefiere int, supongo.

Creo que una int tiene una preferencia sobre el tipo nvarchar, por lo que debe tratar de forma implícita para convertir el nvarchar al valor int.

editar # 1

  

"Pero ¿no sería sensato tratar de convertir el valor que he dado al tipo del campo Estoy buscando en lugar de al revés?"

Sí, esto sería bueno si lo hizo. Pero supongo que es porque no habría intentos de conversión demasiado dar a entender cuando se trata de algún otro tipo de comparación.

where dateOfBirth = 1976-6-16

vs

where dateOfBirth = N'1976-06-16'

En primer ejemplo, ¿cuál es la intención del usuario? ¿Es para verificar si dateOfBirth es iguales al valor fecha de 1976-06-16 o va a comparar con un valor entero de 1976 - 6 - 16, lo que daría lugar a 1954, lo que podría ser lo suficientemente razonable para considerarlo como el año de una fecha determinada.

Creo que hay conversiones implícitas tales nvarchar a datetime, pero no sería mucho a la cubierta, por lo que se limitaron a la conversión más común posible.

¿Por qué se especifica un valor entero si conoce la columna es de tipo nvarchar?

Desafortunadamente SQL Server, al igual que muchas implementaciones de SQL, es un largo camino por detrás de otras lenguas en su soporte tipo. La verificación de tipos se realiza por lo general sólo en tiempo de ejecución. Por lo tanto consultas como la suya no se comprueban para la sintaxis de relieve problemas como el que tenemos aquí. Su consulta es la culpa, ya que están descalce de diferentes tipos, sino porque SQL Server no vaidate que los resultados serán impredecibles, dependiendo de los datos.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top