2016-09-23 11 views
2

"ORDER BY"節の前にスペースがないアプリケーションでSQLを見つけました。私はこれがうまくいくことにも驚きました。整数のインクリメントリストで、このSQLは、これはまた、文字列を使用していますのMicrosoft SQL Server 2012のORDER BYの前に空白がありません - これはなぜ機能しますか?

select 
* 
FROM [counter] c 
where c.counter_id = 1000ORDER by counter_id 

で正常に動作します1列、counter_idは、単にそこにある。ここで、[カウンター]と呼ばれる数値のテーブルを、与えられた

例えば:

WHERE some_string = 'test'ORDER BY something 

私の質問は、任意の潜在的な落とし穴や危険性は、このクエリを使用してありますか?逆に、何か利点はありますか?その空白(何らかのアプリケーションではよく考慮されるかもしれない)のネットワークトラフィックの8ビットはどれくらい保存されますか?

+5

スキャナは、スペースとは無関係に、とにかくこれらのトークンを読み取ることができます。しかし、それを期待しないでください。後のバージョンでは、処理が異なる可能性があります。 – jarlh

+0

クエリパーザまたはスキャナはこのように設計されていますが、わかりません。 'select * from tbl'も動作します。 – par

+1

'O'は数字の有効な部分ではないので、その部分にすることはできず、' 1000ORDER 'は有効な列名(引用符なし)ではないので、' 1000'は数値の一部でなければならないのであいまいではありません。しかし、私はこれを使うことの不利な点しか見ません。 –

答えて

4

私は、これは数値と文字列で動作する理由を説明しましょう。

名前がエスケープされていない限り、数字は識別子を開始できないためです。基本的に、SQLクエリに起こる最初のことはトークン化です。つまり、クエリのコンポーネントは、識別子とキーワードに分割され、次に解析されます。

SQL Serverでは、キーワード、識別子、および関数名などは、数字で始めることはできません(名前がエスケープされていない限り)。したがって、トークナイザが数字に遭遇すると、数字があることがわかります。この数字は、数字以外の文字に遭遇したときに終了します。したがって、1000ORDER BYのような一連の文字は、簡単に3つのトークン、1000,ORDERおよびBYに変換されます。

同様に、一重引用符が最初に検出されたときは、常に文字列リテラルを表します。文字列リテラルは、最後の一重引用符が見つかると終了します。次の文字セットは別のトークンを表します。

これらのニュアンスを使用する理由はまったくありません。まず、これらのルールはSQL Serverのトークン化のプロパティであり、必ずしも他のデータベースには適用されません。第二に、SQLの目的は人の人間が照会を表現できるようにすることです。それは私たちが読むより重要なやり方です。

+0

'数字が数字以外の文字に遭遇したときに数字が終了します。' - そうではありませんが、遭遇することがあります。またはEまたはさらには - – Cato

0

jarlhはトークンのスキャンと解析中に違いがあるかもしれませんが、したがって、それは長所や短所

enter image description here

0

パーサは文字を調べるに大きな違いではないかもしれません、それはキーワード、識別子、文字列定数をチェックし、言語の全体的なセマンティックと構文構造に一致します。 'Order by'はキーワードであり、sqlパーサーはクエリ内で可能な構文上の位置を知っているので、エラーを投げずにそれを解釈します。これは、あなたの注文が何のエラーも投げない理由です。 Parsing sql query

Parsing SQL

+0

最初に文字列を引き出す必要があります。それ以外の場合は「* MyTableから」[ORDER BY X] – Cato

+0

これは問題ではありません。なぜならこれらは字句トークンを生成している間にパーサーが気にするからです。 Cyclotron3x3

+0

これは問題なく動作しますが、文字列を決定する必要がありますそれはキーワードを決定する前に、実際にキーワードを見つけることで始めることはできません。 – Cato

関連する問題