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 }
動作の比較¶
SQL Serverの動作¶
SQL Serverでは、 SET QUOTED_IDENTIFIER 設定によって二重引用符の解釈方法が決まります。
ON の場合(デフォルト) :二重引用符で識別子を区切り、オブジェクト名に特殊文字や予約キーワードを使用できます。
OFF の場合 :二重引用符は文字列リテラルの区切り文字として扱われます(一重引用符と同様)。
Snowflakeの動作¶
Snowflakeは常に二重引用符を識別子の区切り文字として扱います( SQL Serverの QUOTED_IDENTIFIER ON と同じ)。OFF 設定に相当するものはありません。主要な違いは次のとおりです。
大文字と小文字の区別 :
引用符で囲まれていない識別子は自動的に大文字に変換されます
引用符で囲まれた識別子は変換されず、大文字と小文字が区別されます
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";
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";
違いの例
大文字と小文字を区別しない照合( _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";
この場合、 _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
Snowflakeの動作が異なるのは、デフォルトで引用符で囲まれた識別子の大文字と小文字を区別するためです。これは、セッションの使用を変更することで機能を近づけられる可能性があります。
ALTER SESSION SET QUOTED_IDENTIFIERS_IGNORE_CASE = TRUE;
アカウントレベルでパラメーターを設定したい場合は、以下のコマンドを使用できます。
ALTER ACCOUNT SET QUOTED_IDENTIFIERS_IGNORE_CASE = TRUE;
これは、そのアカウントに関連するすべてのセッションのパラメーターを設定します。詳細については、以下の ドキュメント をご確認ください。
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];
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";
移行に関する考慮事項¶
識別子の大文字小文字の区別を確認する :Snowflakeへの移行時に、特に引用符で囲まれた識別子について、一貫した大文字小文字の区別を確保します。
文字列リテラル :二重引用符で囲まれた文字列リテラルを一重引用符で囲まれたリテラルに置き換えます。
QUOTED_IDENTIFIERS_IGNORE_CASE の使用 :大文字と小文字の区別の問題を軽減するために、移行の初期段階でこのパラメーターを
TRUEに設定することを検討してください。徹底的にテストする :移行後にすべてのオブジェクト参照が正しく動作することを確認します