Analysieren des SQL Server-Zahlenliterals mit Unterstrich

8

Ich frage mich, warum es funktioniert und warum es keinen Fehler zurückgibt:

%Vor%

Ergebnis:

%Vor%

Zweiter Fall:

%Vor%

Metadaten prüfen:

%Vor%

Während der Bezeichner, der mit dem Buchstaben beginnt, sich so verhält, wie ich es mir vorstellen sollte:

%Vor%

LiveDemo

    
lad2025 14.03.2016, 12:51
quelle

2 Antworten

9

SQL behandelt Abfragen wie

%Vor%

als

%Vor%

ist die Abkürzung für

%Vor%

SQL Server erwartet, dass Spaltennamen einigen Regeln für Namenskonventionen folgen, wie in diesem MSDN-Link beschrieben

  

Die Namen von Variablen, Funktionen und gespeicherten Prozeduren müssen den folgenden Regeln für Transact-SQL-IDs entsprechen.   Das erste Zeichen muss einer der folgenden sein:

     
  1. Ein Buchstabe gemäß dem Unicode-Standard 3.2. Die Unicode-Definition von Buchstaben enthält lateinische Zeichen von a bis z, von   A bis Z, und auch Buchstaben aus anderen Sprachen.
  2.   
  3. Der Unterstrich (_), ein Vorzeichen (@) oder ein Nummernzeichen (#).

         

    Bestimmte Symbole am Anfang eines Bezeichners haben in SQL Server eine besondere Bedeutung. Ein regulärer Bezeichner, der mit dem at beginnt   sign kennzeichnet immer eine lokale Variable oder einen Parameter und kann nicht verwendet werden   als der Name eines anderen Objekttyps. Eine ID, die beginnt   mit einem Nummernzeichen bezeichnet eine temporäre Tabelle oder Prozedur. Ein   Bezeichner, die mit doppelten Zahlenzeichen (##) beginnen, bezeichnen ein globales   temporäres Objekt Obwohl das Nummernzeichen oder das doppelte Nummernzeichen   Zeichen können verwendet werden, um die Namen anderer Arten von Objekten zu beginnen,   Wir empfehlen diese Praxis nicht.

  4.   

Einige Transact-SQL-Funktionen haben Namen, die mit doppelten at-Zeichen (@@) beginnen. Um Verwechslungen mit diesen Funktionen zu vermeiden, sollten Sie dies nicht tun   Verwenden Sie Namen, die mit @@ beginnen.

Auch die Syntax für SELECT nach MSDN ist wie

  

WÄHLEN [ALLE | DISTINCT] [TOP (Ausdruck) [PERCENT] [MIT KRAWATTEN   ]] :: =       {         *         | {Tabellenname | Ansichtsname | Tabellenalias}. *         | {             [{Tabellenname | Ansichtsname | Tabellenalias}. ]                  {Spaltenname | $ IDENTITÄT | $ ROWGUID}             | udt_spaltenname [{. | ::} {{Eigenschaftsname | Feldname }               | Methodenname (Argument [, ... n])}]             | Ausdruck             [[AS] Spaltenalias]            }         | Spaltenalias = Ausdruck       } [, ... n]

In diesem Fall sucht der SQL-Parser zuerst nach dem Tabellennamen und dann nach dem Spaltennamen, Identität und Rowguid und so weiter, bis die Übereinstimmung mit

gefunden wird

| Ausdruck [[AS] column_alias]

Es liest dann den Literalwert bis zum Unterstrich, der erkennt, dass das Literal beendet sein muss, und beginnt die späteren Zeichen als Spaltenalias ohne explizite AS

zu analysieren

Um dies zu überprüfen, versuchen Sie folgenden Code in SQL Server

%Vor%

Dies führt zu den gleichen Ergebnissen wie

%Vor%

Auch um zu überprüfen, was ich gerade oben geschrieben habe, siehe den Screenshot von SSMS, der eine Code-Hervorhebung auf AS

macht

In Ihrem ersten Beispiel 2015 ist Integer-Literal und im zweiten Beispiel 2.1 ist Dezimal-Literal

In Ihrem dritten Beispiel ist a kein gültiges Literal. Wenn Sie es versuchen

%Vor%

Damit erhalten Sie ein Ergebnis wie

%Vor%

PS : Ihr werdet sehen, dass dies bei # genauso funktioniert.

So SELECT 2015#11 wird ähnliche Ergebnisse geben

%Vor%     
DhruvJoshi 14.03.2016, 12:54
quelle
3

Um zu verstehen, was passiert, müssen Sie verstehen, was SQL Server als Bezeichner akzeptiert. Es gibt viele Regeln, die hier dokumentiert sind. Aber das Wichtigste ist:

  

Das erste Zeichen muss einer der folgenden sein:

     
  1. Ein Buchstabe gemäß dem Unicode-Standard 3.2. Die Unicode-Definition von Buchstaben enthält lateinische Zeichen von a bis z, von   A bis Z, und auch Buchstaben aus anderen Sprachen.

  2.   
  3. Der Unterstrich (_), ein Vorzeichen (@) oder ein Nummernzeichen (#).

  4.   

Der wichtige Punkt ist, dass, wenn der SQL Server-Parser auf eine Ziffer stößt, er sich selbst sagt: "Dies ist eine Zahl". Wenn es den Unterstrich trifft, heißt es "Nun, keine Nummer mehr, muss etwas anderes beginnen". Der Parser erkennt die zweite Komponente als gültigen Bezeichner. Dies wird folgendermaßen behandelt:

%Vor%

was für einen Spaltenalias ist, auch ohne as .

    
Gordon Linoff 14.03.2016 13:00
quelle