SnowConvert AI - Servidor SQL - Azure Synapse - QUOTED_IDENTIFIER

Applies to
  • SQL Server

  • Azure Synapse Analytics

Descrição

Esta instrução controla se as aspas duplas são usadas para delimitar identificadores (como nomes de tabelas, nomes de colunas etc.) ou literais de cadeia de caracteres no servidor SQL. Se SET QUOTED_IDENTIFIER estiver ON, os identificadores podem ser delimitados por aspas duplas e os literais devem ser delimitados por aspas simples. Se estiver OFF, as aspas duplas são tratadas como delimitadores literais de cadeia de caracteres. Acesse SET QUOTED_IDENTIFIER para saber mais sobre esta instrução.

Sintaxe do Transact-SQL

 SET QUOTED_IDENTIFIER { ON | OFF }
Copy

Comparação de comportamentos

Comportamento do servidor SQL

No servidor SQL, a configuração SET QUOTED_IDENTIFIER determina como as aspas duplas são interpretadas:

  • ** Se estiver ON (padrão)**: Identificadores delimitados por aspas duplas, permitindo caracteres especiais e palavras-chave reservadas em nomes de objetos

  • Se estiver OFF: As aspas duplas são tratadas como delimitadores literais de cadeia de caracteres (semelhantes às aspas simples)

Comportamento do Snowflake

O Snowflake sempre trata aspas duplas como delimitadores identificadores (equivalentes à configuração do servidor SQL QUOTED_IDENTIFIER ON). Não há equivalente para a configuração OFF. As principais diferenças incluem:

  1. Diferenciação entre maiúsculas e minúsculas:

    • Identificadores sem aspas são automaticamente convertidos em maiúsculas

    • Identificadores entre aspas preservam a caixa exata e há diferenciação entre maiúsculas e minúsculas

  2. Parâmetro QUOTED_IDENTIFIERS_IGNORE_CASE: Controla a diferenciação de letras maiúsculas e minúsculas para identificadores entre aspas

Amostra de padrões da origem

SET QUOTED_IDENTIFIER ON

Se QUOTED_IDENTIFIER estiver ON no servidor SQL, as aspas duplas podem ser usadas para delimitar identificadores com espaços ou caracteres especiais.

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

Exemplo de diferença

Suponha que você tenha migrado uma tabela de um banco de dados do servidor SQL com um agrupamento que não diferencia maiúsculas de minúsculas (_CI):

Servidor SQL (com agrupamento _CI):

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

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

Neste caso, o agrupamento _CI torna as duas instruções SELECT intercambiáveis.

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

O comportamento do Snowflake é diferente porque respeita a caixa do identificador entre aspas por padrão. Isso pode ser acessado alterando a sessão.

ALTER SESSION SET QUOTED_IDENTIFIERS_IGNORE_CASE = TRUE;
Copy

Se você quiser definir o parâmetro no nível da conta, você pode usar o seguinte comando:

ALTER ACCOUNT SET QUOTED_IDENTIFIERS_IGNORE_CASE = TRUE;
Copy

Isso definirá o parâmetro para todas as sessões associadas à conta. Para mais informações, verifique a seguinte documentação;

SET QUOTED_IDENTIFIER OFF

Se QUOTED_IDENTIFIER estiver OFF no servidor SQL, as aspas duplas são tratadas como delimitadores de cadeia de caracteres.

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

Considerações sobre migração

  1. Revisar maiúsculas e minúsculas do identificador: Ao migrar para o Snowflake, verifique se o uso de maiúsculas e minúsculas é consistente, especialmente para identificadores entre aspas

  2. Literais de cadeia de caracteres: Substitua literais de cadeia de caracteres entre aspas duplas por literais entre aspas simples

  3. Use QUOTED_IDENTIFIERS_IGNORE_CASE: Considere definir esse parâmetro como TRUE no início da migração para reduzir problemas de diferenciação entre maiúsculas e minúsculas

  4. Teste minuciosamente: Após a migração, verifique se todas as referências de objetos funcionam corretamente