2015-08-03 7 views
5

Un mio amico ha scoperto questo e l'ho testato e confermato in SQL Server Management Studio. Se si trova una colonna che è un INT, è possibile interrogare:Perché questa query SQL sembra mancare uno spazio?

select * 
from table 
where foo = 1AND 1=1; /* works no problem */ 

Nota che non c'è spazio tra il 1 e il AND. Ci stiamo chiedendo perché questo non è un problema per SQL. Si tratta di un comportamento SQL noto?

+7

Gli identificatori non possono iniziare con un numero. E i numeri non possono contenere un 'A'. Quindi il lexer è in grado di distinguere i due token. –

+6

Il parser è in grado di dire quando il numero termina e la parola chiave inizia – Hogan

risposta

9

La pagina Transact-SQL Reference: Data Types: Constants elenca le sintassi valide per le costanti. 1 è una costante valida. 1A non è l'inizio di alcuna costante valida valida, quindi il parser smette di leggere lì.

Nota che non funziona così con tutte le lettere però: E può apparire in un numero. Per questo motivo, select 1except select 1 è ancora valido ma non è quello che ci si potrebbe aspettare. Viene analizzato come select 1e as xcept in cui è stata omessa la parola chiave opzionale as, seguita da un'istruzione aggiuntiva select 1. È completamente diverso da select 1 except select 1.

+2

Bel esempio ... –

+1

Grazie. In realtà stavo solo cercando di convincermi a lamentarsi di un errore di sintassi, e all'inizio abbastanza confuso quando ho avuto dei risultati. :) – hvd

+0

In base alla frequenza con cui si verificano errori durante la scrittura di SQL, sono sorpreso che funzioni. Il tuo esempio mi rende ancora peggio, penso che dovrebbero urlarti quando fai una di queste cose. – Andrew

2

Non diverso da 1=1 o 1+1. Vedere questo sqlfiddle:

select case when 'a'in('a','b')then'a'else'b'end; 

Stesso risultato in MySQL btw.

Problemi correlati