2015-08-03 5 views
5

Ein Freund von mir entdeckte dies und ich habe es getestet und in SQL Server Management Studio bestätigt. Wenn Sie eine Spalte finden, die ein INT ist, können Sie abfragen:Warum funktioniert diese SQL-Abfrage, bei der ein Leerzeichen fehlt?

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

Beachten Sie, dass es zwischen dem 1. und dem AND kein Platz ist. Wir fragen uns, warum dies kein Problem für SQL ist. Ist das ein bekanntes SQL-Verhalten?

+7

Bezeichner dürfen nicht mit einer Nummer beginnen. Und Zahlen können kein 'A' enthalten. So kann der Lexer die beiden Token voneinander unterscheiden. –

+6

Der Parser kann erkennen, wann die Nummer endet und das Schlüsselwort beginnt – Hogan

Antwort

9

Die Seite Transact-SQL Reference: Data Types: Constants listet die gültigen Syntaxen für Konstanten auf. 1 ist eine gültige Konstante. 1A ist kein Anfang einer möglichen gültigen Konstante, daher hört der Parser auf, dort zu lesen.

Beachten Sie, dass es nicht so funktioniert mit allen Buchstaben aber: E kann in einer Nummer erscheinen. Aus diesem Grund ist select 1except select 1 immer noch gültig, aber nicht das, was Sie erwarten könnten. Dies wird als select 1e as xcept geparst, wobei das optionale Schlüsselwort as weggelassen wurde, gefolgt von einer zusätzlichen Anweisung select 1. Es ist völlig anders als select 1 except select 1.

+2

Schönes Beispiel ... –

+1

Danke. Ich versuchte eigentlich nur, mich über einen Syntaxfehler zu beschweren, und war zunächst ziemlich verwirrt, als ich Ergebnisse bekam. :) – hvd

+0

Basierend auf der Häufigkeit, mit der ich beim Schreiben von SQL auf Fehler stoße, bin ich überrascht, dass es funktioniert. Dein Beispiel macht es noch schlimmer für mich, ich denke, sie sollten dich anschreien, wenn du eines dieser Dinge tust. – Andrew

2

Nicht anders als 1=1 oder 1+1. Sehen Sie diese sqlfiddle:

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

gleiche Ergebnis in MySQL btw.

Verwandte Themen