SnowConvert AI - SQL サーバーとAzure Synapse - QUOTED_IDENTIFIER

Applies to
  • SQL Server

  • Azure Synapse Analytics

説明

このステートメントは、 SQL Serverで、識別子(テーブル名、列名など)や文字列リテラルの区切りに二重引用符を使用するかどうかを制御します。SET QUOTED_IDENTIFIER が ON の場合、識別子は二重引用符で区切ることができ、リテラルは一重引用符で区切る必要があります。OFF の場合、二重引用符は文字列リテラルの区切り記号として扱われます。このステートメントに関する詳細は、 SET QUOTED_IDENTIFIER をご参照ください。

Transact-SQL 構文

 SET QUOTED_IDENTIFIER { ON | OFF }
Copy

動作の比較

SQL Serverの動作

SQL Serverでは、 SET QUOTED_IDENTIFIER 設定によって二重引用符の解釈方法が決まります。

  • ON の場合(デフォルト) :二重引用符で識別子を区切り、オブジェクト名に特殊文字や予約キーワードを使用できます。

  • OFF の場合 :二重引用符は文字列リテラルの区切り文字として扱われます(一重引用符と同様)。

Snowflakeの動作

Snowflakeは常に二重引用符を識別子の区切り文字として扱います( SQL Serverの QUOTED_IDENTIFIER ON と同じ)。OFF 設定に相当するものはありません。主要な違いは次のとおりです。

  1. 大文字と小文字の区別

    • 引用符で囲まれていない識別子は自動的に大文字に変換されます

    • 引用符で囲まれた識別子は変換されず、大文字と小文字が区別されます

  2. QUOTED_IDENTIFIERS_IGNORE_CASE パラメーター :引用符で囲まれた識別子の大文字と小文字の区別を制御します

サンプルソースパターン

SET QUOTED_IDENTIFIER ON

SQL Serverで QUOTED_IDENTIFIER が ON の場合、スペースや特殊文字を含む識別子を区切るために二重引用符を使用することができます。

SQL Server

 SET QUOTED_IDENTIFIER ON;
 
 CREATE TABLE "Order Details" (
     "Order ID" INT,
     "Product Name" VARCHAR(50),
     "Unit Price" DECIMAL(10,2)
 );
 
 SELECT "Order ID", "Product Name" FROM "Order Details";
Copy

Snowflake

----** SSC-FDM-TS0033 - SET QUOTED_IDENTIFIER STATEMENT MAY HAVE A DIFFERENT BEHAVIOR IN SNOWFLAKE **
--SET QUOTED_IDENTIFIER ON

 CREATE OR REPLACE TABLE "Order Details" (
     "Order ID" INT,
     "Product Name" VARCHAR(50),
     "Unit Price" DECIMAL(10, 2)
 )
 COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": {  "major": 0,  "minor": 0,  "patch": "0" }, "attributes": {  "component": "transact",  "convertedOn": "09/22/2025",  "domain": "no-domain-provided" }}'
;

 SELECT
     "Order ID",
     "Product Name"
 FROM
     "Order Details";
Copy

違いの例

大文字と小文字を区別しない照合( _CI )を持つ SQL Serverデータベースからテーブルを移行したとします。

SQL Server( _CI 照合あり):

-- This statement is valid
SELECT "MyColumn" FROM "MyTable";

-- This statement is also valid and returns the same result
SELECT "mycolumn" FROM "MyTable";
Copy

この場合、 _CI 照合により、2つの SELECT ステートメントは互換性を持ちます。

Snowflake:

-- This statement is valid
SELECT "MyColumn" FROM "MyTable";

-- This statement will fail because "mycolumn" does not match "MyColumn"
SELECT "mycolumn" FROM "MyTable";
-- ERROR:  SQL compilation error: error in select clause: mycolumn does not exist
Copy

Snowflakeの動作が異なるのは、デフォルトで引用符で囲まれた識別子の大文字と小文字を区別するためです。これは、セッションの使用を変更することで機能を近づけられる可能性があります。

ALTER SESSION SET QUOTED_IDENTIFIERS_IGNORE_CASE = TRUE;
Copy

アカウントレベルでパラメーターを設定したい場合は、以下のコマンドを使用できます。

ALTER ACCOUNT SET QUOTED_IDENTIFIERS_IGNORE_CASE = TRUE;
Copy

これは、そのアカウントに関連するすべてのセッションのパラメーターを設定します。詳細については、以下の ドキュメント をご確認ください。

SET QUOTED_IDENTIFIER OFF

SQL Serverで QUOTED_IDENTIFIER が OFF の場合、二重引用符は文字列の区切り文字として扱われます。

SQL Server

 SET QUOTED_IDENTIFIER OFF;
 
 -- Double quotes treated as string literals
 SELECT * FROM customers WHERE name = "John Doe";
 
 -- Must use square brackets for identifiers with spaces
 SELECT [Order ID] FROM [Order Details];
Copy

Snowflake

 ----** SSC-FDM-TS0028 - QUOTED_IDENTIFIER OFF behavior not supported in Snowflake **
 -- Double quotes always delimit identifiers in Snowflake
 -- Use single quotes for string literals
 SELECT * FROM customers WHERE name = 'John Doe';
 
 -- Double quotes delimit identifiers (case-sensitive)
 SELECT "Order ID" FROM "Order Details";
Copy

移行に関する考慮事項

  1. 識別子の大文字小文字の区別を確認する :Snowflakeへの移行時に、特に引用符で囲まれた識別子について、一貫した大文字小文字の区別を確保します。

  2. 文字列リテラル :二重引用符で囲まれた文字列リテラルを一重引用符で囲まれたリテラルに置き換えます。

  3. QUOTED_IDENTIFIERS_IGNORE_CASE の使用 :大文字と小文字の区別の問題を軽減するために、移行の初期段階でこのパラメーターを TRUE に設定することを検討してください。

  4. 徹底的にテストする :移行後にすべてのオブジェクト参照が正しく動作することを確認します