QUOTED_IDENTIFIER
の理解を求めています ここに理解を投稿します。
ANSIは、(文字列ではなく)識別子の前後に引用符を使用することを要求しました。 SQL Serverは次の両方をサポートしていました:
SQL Server 元々:
-
SELECT "Hello、world!"
-引用符 -
SELECT'Hello、world!'
-アポストロフィ -
CREATE TABLE [世界で最もひどいテーブル名]([Hello、world!] int)
-
SELECT [Hello、world!]FROM[世界で最もひどいテーブル名]
ANSI (つまり、 SET QUOTED_IDENTIFIER ON
):
-
SELECT "Hello、world!"
-文字列を囲むANSIでは引用符は無効になりました -
SELECT'Hello、world!'
-アポストロフィ -
CREATE TABLE "世界で最もひどいテーブル名"( "Hello、world!" int)
-
SELECT "Hello、world!" FROM「世界で最もひどいテーブル名」
当初、SQLServerでは引用符を使用できました ( "..."
)およびアポストロフィ ('...'
)文字列の周りを交換可能に(Javascriptのように):
-
SELECT "Hello、world!"
-引用符 -
SELECT'Hello、world!'
-アポストロフィ
また、オブジェクトの命名規則に違反する名前テーブル、ビュー、プロシージャ、列などが必要な場合は、角かっこで囲むことができます。 ([コード> 、
]コード> ):
CREATE TABLE [The world's most awful table name] ([Hello, world!] int)
SELECT [Hello, world!] FROM [The world's most awful table name]
そして、それはすべてうまくいき、理にかなっています。
その後、ANSIが登場し、他のアイデアがありました:
- ファンキーな名前の場合は、引用符で囲みます (
"..."
) - アポストロフィを使用する (
'...'
)文字列の場合 - 角かっこも気にしません
つまり、 "quote" ファンキーな列またはテーブル名は引用符を使用する必要があります:
SELECT "Hello, world!" FROM "The world's most awful table name"
SQL Serverをご存知の場合は、引用符をご存知でしょう。 文字列を表すためにすでに使用されていました。そのANSI-SQLをやみくもに実行しようとした場合 T-SQLのように :それはナンセンスであり、SQL Serverはそう言っています:
Msg 102, Level 15, State 1, Line 8
Incorrect syntax near 'The world's most awful table name'.
これは、実行しようとすることと道徳的に同等です:
SELECT 'Hello, world!' FROM 'The world''s most awful table name'
これは実行するようなものです:
SELECT 'string' FROM 'string'
そこでMicrosoftは、ANSIフレーバーのSQLにオプトインできる機能を追加しました。
オリジナル (または QUOTED_IDENTIFIER
オフ) :
SELECT "Hello, world!" --valid
SELECT 'Hello, world!' --valid
QUOTED_IDENTIFIERをオンに設定 :
SELECT "Hello, world!" --INVALID
SELECT 'Hello, world!' --valid
SQL Serverでは、引き続き[角かっこ]
を使用できます 、"引用符"
を使用するように強制するのではなく 。ただし、QUOTED_IDENTIFIERをオンにすると、できません "文字列を二重引用符で囲む"
を使用します 、'一重引用符アポストロフィ'
のみを使用する必要があります 。