sql >> データベース >  >> RDS >> Sqlserver

QUOTED_IDENTIFIERを理解する

    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が登場しました

    その後、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'
    
    新しいANSI動作にオプトインする必要があります

    そこで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をオンにすると、できません "文字列を二重引用符で囲む"を使用します 、'一重引用符アポストロフィ'のみを使用する必要があります 。



    1. SQLiteで月の最初の月曜日を取得する

    2. ループせずにphpとmysqlを使用してスコアテーブルから誰かの「ランク」を取得する最善の方法

    3. 24時間後に期限切れになるSQLエントリ

    4. T-SQLでのSQLServer正規表現