SnowConvert AI - Serveur SQL-Azure Synapse - QUOTED_IDENTIFIER

Applies to
  • SQL Server

  • Azure Synapse Analytics

Description

Cette instruction contrôle si des guillemets doubles sont utilisés pour délimiter les identificateurs (tels que les noms de table, les noms de colonne, etc.) ou les littéraux de chaîne dans le serveur SQL. Lorsque SET QUOTED_IDENTIFIER est ON, les identificateurs peuvent être délimités par des guillemets doubles et les littéraux doivent être délimités par des guillemets simples. Lorsque OFF, les guillemets doubles sont traités comme des délimiteurs de littéral de chaîne. Consultez SET QUOTED_IDENTIFIER pour obtenir plus d’informations sur cette instruction.

Syntaxe Transact-SQL

 SET QUOTED_IDENTIFIER { ON | OFF }
Copy

Comparaison des comportements

Comportement du serveur SQL

Dans le serveur SQL, le paramètre SET QUOTED_IDENTIFIER détermine comment les guillemets doubles sont interprétés :

  • Lorsque ON (par défaut) : Les guillemets doubles délimitent les identificateurs, permettant l’insertion de caractères spéciaux et de mots-clés réservés dans les noms d’objets

  • Lorsque OFF : Les guillemets doubles sont traités comme des délimiteurs de littéral de chaîne (similaire aux guillemets simples).

Comportement de Snowflake

Snowflake traite toujours les guillemets doubles comme des délimiteurs d’identificateur (équivalent à QUOTED_IDENTIFIER ON du serveur SQL). Il n’y a pas d’équivalent au paramètre OFF. Les différences sont les suivantes :

  1. Sensibilité à la casse :

    • Les identificateurs sans guillemets sont automatiquement convertis en majuscules

    • Les identificateurs entre guillemets préservent la casse exacte et deviennent sensibles à la casse

  2. Paramètre QUOTED_IDENTIFIERS_IGNORE_CASE : Contrôle la sensibilité à la casse pour les identificateurs entre guillemets

Modèles d’échantillons de sources

SET QUOTED_IDENTIFIER ON

Lorsque QUOTED_IDENTIFIER est ON dans le serveur SQL, les guillemets doubles peuvent être utilisés pour délimiter les identificateurs contenant des espaces ou des caractères spéciaux.

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

Exemple de la différence

Supposons que vous ayez migré une table depuis une base de données de serveur SQL avec un classement insensible à la casse (_CI) :

Serveur SQL (avec classement _CI) :

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

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

Dans ce cas, le classement _CI rend les deux instructions SELECT interchangeables.

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

Le comportement de Snowflake est différent, car il respecte par défaut la casse de l’identificateur entre guillemets. Il serait possible d’y accéder en modifiant l’utilisation de la session.

ALTER SESSION SET QUOTED_IDENTIFIERS_IGNORE_CASE = TRUE;
Copy

Si vous souhaitez définir le paramètre au niveau du compte, vous pouvez utiliser la commande suivante :

ALTER ACCOUNT SET QUOTED_IDENTIFIERS_IGNORE_CASE = TRUE;
Copy

Le paramètre sera alors défini pour toutes les sessions associées au compte. Pour plus d’informations, consultez la [documentation] suivante (https://docs.snowflake.com/en/sql-reference/identifiers-syntax) ;

SET QUOTED_IDENTIFIER OFF

Lorsque QUOTED_IDENTIFIER est OFF dans le serveur SQL, les guillemets doubles sont traités comme des délimiteurs de chaîne.

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

Remarques relatives à la migration

  1. Revoir la casse des identificateurs : Vérifiez la cohérence de la casse lors de la migration vers Snowflake, en particulier pour les identificateurs entre guillemets

  2. Littéraux de chaînes : Remplacez les littéraux de chaîne entre guillemets doubles par des littéraux entre guillemets simples

  3. Utilisez QUOTED_IDENTIFIERS_IGNORE_CASE : Songez à définir ce paramètre sur TRUE dès la début de la migration pour réduire les problèmes de sensibilité à la casse

  4. Effectuez des tests avancés : Vérifiez que toutes les références d’objets fonctionnent correctement après la migration