SQL Serverでのエイリアシングの角括弧と一重引用符の違いは何ですか?



What Is Difference Between Square Brackets



解決:

質問に答えるには、「好み/違いはありますか」:

はい、意見と同じくらい多くの好みがありますが、誰の好みを採用するかに注意してください。



ベストプラクティスとして、特別な労力を必要としない場合は、ポータブルSQLを作成することをお勧めします。

特定のサンプルの場合、ポータブルクエリを作成するのも同じくらい簡単です...



Ordersから 'OrderId'としてOrderIdを選択します

...ポータブルではないものを書くのと同じように:

Ordersから[OrderId]としてOrderIdを選択します

同じ数のキーストロークの同等の移植可能な形式がある場合は、非標準のSQLを記述しないことが望ましいです。

エスケープするための[]の急増は、SQL Server ManagementStudioやMSAccessクエリビルダーなどのツールが原因で、すべてを怠惰にエスケープします。 SQL Serverでキャリアを積んでいる開発者には決して起こらないかもしれませんが、括弧は、AccessおよびSQLServerアプリを他のデータベースプラットフォームに移植するために何年にもわたって多くの費用を引き起こしました。すべてを引用するOracleツールについても同じことが言えます。訓練を受けていない開発者は、DDLを例と見なし、手書きで同じスタイルを使用します。ツールが改善され、私たちがより良いものを要求するまで、それを断ち切るのは難しいサイクルです。 Oracleでは、引用と大文字と小文字の混合を組み合わせると、大文字と小文字が区別されるデータベースになります。人々がデータベース内のすべての識別子を引用するプロジェクトを見たことがあり、開発者がドキュメントやベストプラクティスの記事なしで島で進化したThe Land of theLostにいるような気がしました。



DDLを最初から正規化された正当な識別子([Order Id]の代わりにOrderIdまたはorder_Idを使用)で記述する場合、エスケープ文字が必要になる可能性のある神話上のキーワードについて心配する必要はありません。データベースは、次の場合に通知します。予約語を使用しました。あるバージョンのSQLServerから別のバージョンにアプリをアップグレードし、次の理由で破損した回数を1本の指で数えることができます。 新着 予約語。

これはしばしば白熱した議論の対象となるので、別の方法で考えると:

C#プログラマーは、合法であっても、すべての変数を@でエスケープするわけではありません。これは奇妙な慣習と見なされ、StackOverflowで嘲笑の対象になります。エスケープはエッジケース用である必要があります。しかし、準拠するC#識別子を作成する同じ開発者は、SQL内のすべての識別子をエスケープして、ひどく醜い、移植性のないSQL「コード」を作成してもかまいません。コンサルタントとして、[]には構文が必要だと正直に考えている複数のSQLServerプログラマーに会いました。私は開発者を非難しません。私は道具のせいです。


有効な設定によって異なります。は有効かどうか。そして、あなたは逃した'。区切り識別子を参照してください。

QUOTED_IDENTIFIERがONに設定されている場合、SQL Serverは、SQLステートメントでの二重引用符( ')と一重引用符(')の使用に関するISO規則に従います。例えば:

  • 二重引用符は、識別子を区切るためにのみ使用できます。文字列を区切るために使用することはできません。

  • 文字列を囲むには、一重引用符を使用する必要があります。識別子を区切るために使用することはできません。


QUOTED_IDENTIFIERがOFFに設定されている場合、SQLServerは一重引用符と二重引用符に次のルールを使用します。

  • 引用符を使用して識別子を区切ることはできません。代わりに、角かっこを区切り文字として使用する必要があります。

  • 一重引用符または二重引用符を使用して、文字列を囲むことができます。

そして最後に:

QUOTED_IDENTIFIERの設定に関係なく、角かっこで囲まれた区切り文字は常に使用できます。

上記のすべての引用符で、角かっこを参照する場合は、[]角かっこ。


一重引用符の方が読みやすくなります。上に示したように、赤で強調表示されています。

MySQLは `backticks`を使用して特殊文字をエスケープします。

MSSQLは、識別子(テーブル、列など)に「二重引用符」または[括弧]を使用できます。
文字列またはエイリアスの場合は「一重引用符」。

角括弧は、スペース、ピリオド、ハイフンなどの特殊文字が構文エラーをスローしないように、主にオブジェクトをカプセル化するために使用されます。

列エイリアスの前に「as」キーワードを使用することをお勧めします-はるかに読みやすくなっています。

select [column with space] as'my col 'from'table with space' where n = 'foo' select'column with space 'as'my col' from [table with space] where n = 'foo'