Requisitos para identificadores

Identificadores de objetos não delimitados por aspas:

  • Começam com uma letra (A-Z, a-z) ou um sublinhado (“_”).

  • Contêm somente letras, sublinhados, dígitos decimais (0-9) e cifrões (“$”).

  • São armazenados e resolvidos como caracteres maiúsculos (por exemplo, id é armazenado e resolvido como ID).

Se você colocar um identificador entre aspas duplas (por exemplo, “Meu identificador com espaços em branco e pontuação.”), aplicam-se as seguintes regras:

  • As letras maiúsculas/minúsculas do identificador são preservadas ao armazenar e resolver o identificador (por exemplo, "id" é armazenado e resolvido como id).

  • O identificador pode conter e começar com ASCII, ASCII estendido e caracteres não-ASCII.

    Para usar o caractere de aspas duplas dentro de um identificador entre aspas, use duas aspas. Por exemplo:

    create table "quote""andunquote""" ...
    
    Copy

    cria uma tabela chamada:

    quote"andunquote"
    
    Copy

    em que as aspas fazem parte do nome.

Nota

  • Independentemente de um identificador não estar entre aspas ou estar entre aspas duplas, o número máximo de caracteres permitido é 255 (incluindo espaços em branco).

  • Os identificadores também podem ser especificados usando-se literais de cadeia de caracteres, variáveis de sessão ou variáveis de vinculação. Para obter mais detalhes, consulte Variáveis SQL.

Neste tópico:

Identificadores não delimitados por aspas

Se um identificador não estiver entre aspas duplas, ele deve começar com uma letra ou sublinhado (_) e não pode conter caracteres estendidos ou espaços em branco.

A seguir estão todos os exemplos de identificadores válidos; entretanto, as letras maiúsculas/minúsculas dos caracteres desses identificadores não seriam preservadas:

myidentifier
MyIdentifier1
My$identifier
_my_identifier
Copy

Identificadores entre aspas duplas

Os identificadores delimitados (ou seja, identificadores entre aspas duplas) diferenciam maiúsculas e minúsculas, além disso podem começar e conter quaisquer caracteres válidos, inclusive:

  • Números

  • Caracteres especiais (., ', !, @, #, $, %, ^, &, * etc.)

  • Caracteres ASCII estendidos e não ASCII

  • Espaços em branco

Por exemplo:

"MyIdentifier"
"my.identifier"
"my identifier"
"My 'Identifier'"
"3rd_identifier"
"$Identifier"
"идентификатор"
Copy

Importante

Se um objeto for criado usando um identificador entre aspas duplas, quando referenciado em uma consulta ou qualquer outra instrução SQL, o identificador deve ser especificado exatamente como criado, incluindo as aspas duplas. A não inclusão das aspas pode resultar em um erro Object does not exist (ou um tipo similar de erro).

Observe também que o identificador inteiro deve estar entre aspas quando referenciado em uma consulta/instrução SQL. Isso é particularmente importante se forem usados pontos finais (.) em identificadores, pois os pontos finais também são usados em nomes de objetos totalmente qualificados para separar cada objeto.

Por exemplo:

"My.DB"."My.Schema"."Table.1"
Copy

Exceções

  • Identificadores entre aspas duplas não são suportados para nomes de funções definidas pelo usuário (UDFs) e procedimentos nos quais a linguagem do manipulador é Java, JavaScript, Script Snowflake ou SQL.

  • Você pode usar apenas caracteres ASCII para nomes de funções definidas pelo usuário (UDFs) e procedimentos em que a linguagem do manipulador seja Java.

Resolução do identificador

Por padrão, o Snowflake aplica as seguintes regras para armazenar identificadores (no momento da criação/definição) e resolvê-los (em consultas e outras instruções SQL):

  • Quando um identificador não está entre aspas, ele é armazenado e resolvido em letras maiúsculas.

  • Quando um identificador está entre aspas duplas, ele é armazenado e resolvido exatamente como inserido, incluindo maiúsculas/minúsculas.

Por exemplo, os quatro nomes a seguir são equivalentes e todos se resolvem como TABLENAME:

TABLENAME
tablename
tableName
TableName
Copy

Em contraste, os quatro nomes a seguir são considerados valores diferentes e únicos:

"TABLENAME"
"tablename"
"tableName"
"TableName"
Copy

Se esses identificadores fossem usados para criar objetos do mesmo tipo (por exemplo, tabelas), eles resultariam na criação de quatro objetos distintos.

Migração de bancos de dados que tratam identificadores entre aspas duplas com distinção de maiúsculas/minúsculas

No padrão ANSI/ISO para SQL, os identificadores entre aspas duplas (identificadores delimitados) diferenciam maiúsculas e minúsculas. Entretanto, algumas empresas fornecem bancos de dados que tratam os identificadores entre aspas duplas sem diferenciar maiúsculas e minúsculas.

Se você estiver migrando seus dados e aplicativos de um desses bancos de dados para o Snowflake, esses aplicativos podem usar aspas duplas delimitando identificadores que não devem diferenciar maiúsculas de minúsculas. Isso pode impedir que o Snowflake resolva os identificadores corretamente. Por exemplo, um aplicativo pode usar aspas duplas delimitando um identificador em minúsculas, e o banco de dados do Snowflake tem o identificador em maiúsculas.

Para contornar essa limitação, o Snowflake fornece o parâmetro de sessão QUOTED_IDENTIFIERS_IGNORE_CASE, que faz com que o Snowflake trate as letras minúsculas dos identificadores entre aspas duplas como maiúsculas ao criar e encontrar objetos.

Consulte as próximas seções para obter detalhes:

Nota

A alteração do valor do parâmetro pode afetar sua capacidade de encontrar objetos existentes. Consulte Impacto da alteração de parâmetro para obter mais detalhes.

Controle de maiúsculas/minúsculas usando o parâmetro QUOTED_IDENTIFIERS_IGNORE_CASE

Para configurar o Snowflake para tratar os caracteres alfabéticos de identificadores entre aspas duplas como maiúsculas para a sessão, defina o parâmetro como TRUE para a sessão. Com essa configuração, todos os caracteres alfabéticos em identificadores são armazenados e resolvidos como caracteres maiúsculos.

Em outras palavras, os oito nomes a seguir são equivalentes e todos se resolvem como TABLENAME:

TABLENAME
tablename
tableName
TableName
"TABLENAME"
"tablename"
"tableName"
"TableName"
Copy

Observe que o parâmetro não tem efeito sobre limitações para identificadores não delimitados por aspas no que diz respeito a números, caracteres estendidos e espaços em branco.

Impacto da alteração de parâmetro

A alteração do parâmetro de sessão QUOTED_IDENTIFIERS_IGNORE_CASE afeta somente novos objetos e consultas:

  • Com a configuração padrão de FALSE, se um objeto for criado usando um identificador entre aspas duplas contendo uma mistura de maiúsculas e minúsculas, o Snowflake armazena o identificador com maiúsculas e minúsculas.

  • Se o parâmetro for alterado depois para TRUE, o Snowflake não será capaz de resolver esse identificador entre aspas duplas com a mistura de maiúsculas e minúsculas, além disso, ele não será capaz de recuperar esse objeto.

Dica

Devido ao impacto que a alteração do parâmetro pode ter na resolução de identificadores, recomendamos enfaticamente escolher o método de resolução de identificadores no início de sua implementação do Snowflake. Em seguida, peça ao administrador da conta que defina o parâmetro em nível de conta para aplicar esse método de resolução como padrão.

Embora você possa anular esse parâmetro em nível de sessão, não encorajamos alterar o parâmetro padrão, a menos que você tenha uma necessidade explícita de fazer isso.

Os exemplos a seguir ilustram o comportamento após alterar o parâmetro de FALSE para TRUE:

-- Set the default behavior
ALTER SESSION SET QUOTED_IDENTIFIERS_IGNORE_CASE = false;

-- Create a table with a double-quoted identifier
CREATE TABLE "One" (i int);  -- stored as "One"

-- Create a table with an unquoted identifier
CREATE TABLE TWO(j int);     -- stored as "TWO"

-- These queries work
SELECT * FROM "One";         -- searches for "One"
SELECT * FROM two;           -- searched for "TWO"
SELECT * FROM "TWO";         -- searches for "TWO"

-- These queries do not work
SELECT * FROM One;           -- searches for "ONE"
SELECT * FROM "Two";         -- searches for "Two"

-- Change to the all-uppercase behavior
ALTER SESSION SET QUOTED_IDENTIFIERS_IGNORE_CASE = true;

-- Create another table with a double-quoted identifier
CREATE TABLE "Three"(k int); -- stored as "THREE"

-- These queries work
SELECT * FROM "Two";         -- searches for "TWO"
SELECT * FROM two;           -- searched for "TWO"
SELECT * FROM "TWO";         -- searches for "TWO"
SELECT * FROM "Three";       -- searches for "THREE"
SELECT * FROM three;         -- searches for "THREE"

-- This query does not work now - "One" is not retrievable
SELECT * FROM "One";         -- searches for "ONE"
Copy

Além disso, se os identificadores para duas tabelas só tiverem como diferença letras maiúsculas e minúsculas, um identificador pode ser resolvido para uma tabela diferente após a alteração do parâmetro:

-- Set the default behavior
ALTER SESSION SET QUOTED_IDENTIFIERS_IGNORE_CASE = false;

-- Create a table with a double-quoted identifier
CREATE TABLE "Tab" (i int);  -- stored as "Tab"

-- Create a table with an unquoted identifier
CREATE TABLE TAB(j int);     -- stored as "TAB"

-- This query retrieves "Tab"
SELECT * FROM "Tab";         -- searches for "Tab"

-- Change to the all-uppercase behavior
ALTER SESSION SET QUOTED_IDENTIFIERS_IGNORE_CASE = true;

-- This query retrieves "TAB"
SELECT * FROM "Tab";         -- searches for "TAB"
Copy