2012-05-02 17 views
6

Sto usando la struttura della tabella ASP.NET appartenenza standard SQL Server e stavo facendo un po 'di interrogare manualmente in studio di gestione e corse questa queryquery SQL non funziona come previsto

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

Avviso del & CID = 49 alla fine - Ho copiato questo da una querystring e ho dimenticato di rimuovere quella parte.

Tuttavia, con mia sorpresa ha restituito i dati correttamente (c'è un utente con l'ID 2ac5dd56-2630-406a-9fb8-d4445bc781da) - qualche idea del perché questo funziona? A mio avviso, non dovrebbe corrispondere o probabilmente più probabilmente lanciare un errore in quanto non dovrebbe essere in grado di convertire in un Guid?

+0

qual è il valore excatly a DB? –

risposta

3

Il tipo uniqueidentifier è considerato un tipo di carattere per consentire la conversione da un'espressione di caratteri, e quindi è soggetto alle regole di troncamento per convertire in un tipo di carattere. In altre parole, quando le espressioni dei caratteri vengono convertite in un tipo di dati carattere di dimensioni diverse, i valori troppo lunghi per il nuovo tipo di dati vengono troncati.

Poiché il tipo di identificatore univoco è limitato a 36 caratteri, i caratteri che superano tale lunghezza vengono troncati.

noti che sopra è citato da MSDN

+0

+1. ma è strano .... gli ho detto di cercare A123 e non A123blabla ..... –

+0

Grazie, ora ha più senso ma sono d'accordo che è strano - se passo in un valore che è inferiore a 36 caratteri allora ottenere un errore di conversione, quindi la mia aspettativa sarebbe che se passassi in più allora fallirebbe anche! –

2

Il parser è (notevolmente) clemente durante la conversione letterali stringa di guid letterali, a quanto pare:

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) 

tutti danno lo stesso risultato, nessun errore.

This is documented behaviour, quindi non possiamo davvero lamentarci:

L'esempio seguente mostra il troncamento dei dati quando il valore è troppo lungo per il tipo di dati che vengono convertiti in. Poiché il tipo di identificatore univoco è limitato a 36 caratteri, i caratteri che superano tale lunghezza vengono troncati.

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

Ecco il set di risultati.

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

(1 row(s) affected) 
+0

Grazie, ora capisco - sembra strano! –

Problemi correlati