2012-05-02 28 views
6

estoy usando la estructura de la tabla de pertenencia de ASP.NET estándar en SQL Server y estaba haciendo un poco de la consulta de forma manual en el estudio de gestión y encontré esta consultaconsulta SQL no funciona como se esperaba

SELECT * 
FROM [aspnet_Users] 
WHERE UserId = '2ac5dd56-2630-406a-9fb8-d4445bc781da&cID=49' 

Aviso & el CID = 49 al final: copié esto de una cadena de consulta y olvidé eliminar esa parte.

Sin embargo, para mi sorpresa, devolvió los datos correctamente (hay un usuario con la ID 2ac5dd56-2630-406a-9fb8-d4445bc781da) - ¿Alguna idea de por qué esto funciona? En mi opinión, ¿no debería coincidir o probablemente lanzar un error, ya que no debería poder convertirse en un Guid?

+0

cuál es el valor excatly al PP? –

Respuesta

3

El tipo uniqueidentifier se considera un tipo de caracteres para los efectos de la conversión de una expresión de caracteres, y por lo tanto está sujeto a las reglas de truncamiento para la conversión a un tipo de carácter. Es decir, cuando las expresiones de caracteres se convierten a un tipo de datos de caracteres de un tamaño diferente, los valores que son demasiado largos para el nuevo tipo de datos se truncan.

Como el identificador único tipo está limitado a 36 caracteres, los caracteres que exceden esa longitud se truncan.

Tenga en cuenta que anteriormente se citó de MSDN

+0

+1. pero es extraño ... le dije que buscara A123 y no A123blabla ..... –

+0

Gracias, eso tiene más sentido ahora, pero estoy de acuerdo que es extraño - si paso en un valor que es menos de 36 caracteres, entonces obtener un error de conversión, así que mi expectativa sería que si pasaba más, ¡también fallaría! –

2

El analizador es (muy) tiró, al convertir a los literales de cadena GUID literales, al parecer:

SELECT CAST('E63F4FFC-8574-428B-B6B8-95CFCA05ED52' AS uniqueidentifier) 
SELECT CAST('E63F4FFC-8574-428B-B6B8-95CFCA05ED52a' AS uniqueidentifier) 
SELECT CAST('E63F4FFC-8574-428B-B6B8-95CFCA05ED52-!' AS uniqueidentifier) 
SELECT CAST('E63F4FFC-8574-428B-B6B8-95CFCA05ED52~#5' AS uniqueidentifier) 
SELECT CAST('E63F4FFC-8574-428B-B6B8-95CFCA05ED52$3%] ' AS uniqueidentifier) 

todos dan el mismo resultado, sin errores.

This is documented behaviour, por lo que no podemos quejar:

El siguiente ejemplo demuestra el truncamiento de datos cuando el valor es demasiado largo para el tipo de datos que están siendo convertidos a. Debido a que el tipo de identificador único está limitado a 36 caracteres, los caracteres que exceden esa longitud se truncan.

DECLARE @ID nvarchar(max) = N'0E984725-C51C-4BF4-9960-E1C80E27ABA0wrong'; 
SELECT @ID, CONVERT(uniqueidentifier, @ID) AS TruncatedValue; 

Aquí está el conjunto de resultados.

String          TruncatedValue 
-------------------------------------------- ------------------------------------ 
0E984725-C51C-4BF4-9960-E1C80E27ABA0wrong 0E984725-C51C-4BF4-9960-E1C80E27ABA0 

(1 row(s) affected) 
+0

Gracias, ahora lo entiendo, aunque parece extraño. –

Cuestiones relacionadas