はじめに
こちらの記事に引き続き、ビューで試してみます。
シンプルにビューを作ってみます。
CREATE VIEW [v_code]
AS
SELECT [id]
, [name]
FROM [m_code]
SSMSから作成したビューのクエリを生成します。
SET ANSI_NULLS ON
SET QUOTED_IDENTIFIER ON
CREATE VIEW [v_code]
AS
SELECT [id]
, [name]
FROM [m_code]
クエリについては変化はないですが、実行前に
- SET ANSI_NULLS ON
- SET QUOTED_IDENTIFIER ON
が追加されています。
「SET ANSI_NULLS ON」って何だろう
ANSI_NULLSが ON の場合、 WHERE column_name = NULL を使用する SELECT ステートメントは、 column_nameに NULL 値がある場合でも 0 行を返します。 WHERE column_name <> NULLを使用する SELECT ステートメントでは、column_nameに NULL 以外の値がある場合でも、0 行が返されます。
ANSI_NULLSが OFF の場合、Equals (=) および Not Equal To (<>) 比較演算子は ISO 標準に従いません。 WHERE column_name = NULLを使用する SELECT ステートメントは、column_nameに null 値を持つ行を返します。 WHERE column_name <> NULLを使用する SELECT ステートメントは、列に NULL 以外の値を持つ行を返します。 また、 WHERE column_name <> XYZ_value を使用する SELECT ステートメントは、 XYZ_value されておらず NULL ではないすべての行を返します。
一言でいうと「column_name = NULL」の挙動が変わります。
以下、上記サイトから抜粋です。
ブール式 | SET ANSI_NULLS ON | SET ANSI_NULLS OFF |
---|---|---|
NULL = NULL | UNKNOWN | TRUE |
1 = NULL | UNKNOWN | FALSE |
NULL <> NULL | UNKNOWN | FALSE |
1 <> NULL | UNKNOWN | TRUE |
NULL > NULL | UNKNOWN | UNKNOWN |
1 > NULL | UNKNOWN | UNKNOWN |
NULL IS NULL | TRUE | TRUE |
1 IS NULL | FALSE | FALSE |
NULL IS NOT NULL | FALSE | FALSE |
1 IS NOT NULL | TRUE | TRUE |
SQL Serverでは「○○ = NULL」ではなく「○○ IS NULL」のように書くものと決めつけていましたが、この設定に因るようです。
「SET QUOTED_IDENTIFIER ON」って何だろう
SET QUOTED_IDENTIFIERがON (既定) の場合、識別子は二重引用符 ("") で区切ることができ、リテラルは単一引用符 ('') で区切る必要があります。 二重引用符で囲まれた文字列はすべて、オブジェクト識別子として解釈されます。 引用符で囲まれた識別子は、Transact-SQL の識別子の規則に従う必要はありません。 これはキーワードにすることができます。また、Transact-SQL 識別子では許可されない文字を含めることができます。 二重引用符 (") が識別子の一部である場合は、2 つの二重引用符 ("") で表すことができます。 SET QUOTED_IDENTIFIER は、データベース内のオブジェクト名に予約済みキーワードを使用する場合に ON する必要があります。
SET QUOTED_IDENTIFIERがOFFされている場合、識別子は引用符で囲むのはできないため、識別子のすべての Transact-SQL ルールに従う必要があります。 詳細については、「 Database 識別子」を参照してください。 リテラルは単一引用符と二重引用符のどちらで区切ることもできます。 リテラル文字列を二重引用符で区切る場合は、文字列の内部でアポストロフィなどの埋め込み単一引用符を使用できます。
つまり
QUOTED_IDENTIFIER ON
だと
SELECT "id"
, "name"
FROM "m_code"
という書き方が許されます。
SQL Serverでは「文字列は二重引用符ではなく単一引用符で括る」と決めつけていましたが、この設定に因るようです。
おわりに
私の知っているSQL Serverの世界は
- SET ANSI_NULLS ON
- SET QUOTED_IDENTIFIER ON
の設定の下の世界でした。
当たり前に思っていたことが設定で変えることできると分かり驚きましたが、これらの設定をOFFにすることは無いだろうと思います。