Fala galera,
Nesse post vamos conhecer um pouco mais sobre a opção “SET QUOTED_IDENTIFIER ON”.
No próximo post também vou mostrar um problema relacionado com essa opção. #gogogo
QUOTED_IDENTIFIER:
Em primeiro lugar, vamos explicar o que é o “QUOTED_IDENTIFIER” e pra que ele serve.
Se você nunca ouviu falar, segue uma referência da Documentação da Microsoft, mas depois vou tentar simplificar a explicação desses conceitos OK:
Quando você abre uma nova sessão no SQL Server, essa opção já vem HABILITADA por padrão.
1 |
SET QUOTED_IDENTIFIER ON |
Você pode conferir isso executando o comando abaixo:
1 |
DBCC USEROPTIONS |
Essa opção faz com que o SQL Server siga as regras ISO relativas às aspas que delimitam identificadores e cadeias de caracteres literais.
- Identificadores delimitados por “aspas duplas” podem ser palavras-chave reservadas Transact-SQL;
- Podem conter caracteres que nem sempre são permitidos pelas regras da sintaxe Transact-SQL para identificadores.
SET QUOTED_IDENTIFIER ON:
“Pô Luiz, tô meio confuso ainda. Facilita aí com alguns exemplos pode ser?”
Exemplo 1:
Para delimitar uma STRING (texto), devemos utilizar as ‘aspas simples’ OK.
1 2 3 |
SET QUOTED_IDENTIFIER ON SELECT 'texto' AS Aspas_Simples |
Se você tentar utilizar as “aspas duplas” será gerado um ERRO:
1 |
SELECT "texto" AS Aspas_Duplas |
Msg 207, Level 16, State 1, Line 12
Invalid column name ‘texto’.
Exemplo 2:
Depois de programar por várias horas, fiquei muito louco e resolvi criar uma tabela chamada INDEX, só que essa é uma palavra-chave reservada e por esse motivo o comando abaixo irá falhar.
1 2 3 4 |
SET QUOTED_IDENTIFIER ON CREATE TABLE INDEX ( ID INT) |
Msg 1018, Level 15, State 1, Line 22
Incorrect syntax near ‘INDEX’. If this is intended as a part of a table hint, A WITH keyword and parenthesis are now required. See SQL Server Books Online for proper syntax.
Contudo, quando a opção está habilitada você consegue utilizar uma palavra-chave reservada no nome de um identificador, desde que esse identificador esteja entre “aspas duplas”.
No caso abaixo, os comandos serão executados normalmente.
1 2 3 4 5 6 7 |
CREATE TABLE "INDEX" ( ID INT) INSERT INTO "INDEX" VALUES (1),(2),(3),(4),(5) SELECT * FROM "INDEX" |
Reparou como a diferença é bem sutil? Eu sei, isso confunde mesmo kkkk.
SET QUOTED_IDENTIFIER OFF:
Vamos fazer mais alguns testes desabilitando essa opção:
Agora vou repetir os dois exemplos anteriores e comparar os resultados.
Exemplo 1:
1 2 3 4 5 |
SET QUOTED_IDENTIFIER OFF SELECT 'texto' AS Aspas_Simples SELECT "texto" AS Aspas_Duplas |
Repare que dessa vez os dois comandos foram executados com sucesso, ou seja, quando a opção está desabilitada, nós podemos representar uma STRING (texto) tanto com ‘aspas simples’ ou com “aspas duplas”.
Exemplo 2:
Vou tentar criar novamente uma tabela chamada INDEX.
1 2 3 4 |
SET QUOTED_IDENTIFIER OFF CREATE TABLE INDEX ( ID INT) |
Msg 1018, Level 15, State 1, Line 22
Incorrect syntax near ‘INDEX’. If this is intended as a part of a table hint, A WITH keyword and parenthesis are now required. See SQL Server Books Online for proper syntax.
Até aqui tudo na mesma, deu erro também. Por fim, vamos colocar as “aspas duplas” no nome do identificador e executar novamente.
1 2 |
CREATE TABLE "INDEX" ( ID INT) |
Msg 102, Level 15, State 1, Line 66
Incorrect syntax near ‘INDEX’.
Repare que dessa vez o erro é diferente. Com a opção desabilitada não será mais possível utilizar as “aspas duplas” para delimitar um identificador que utiliza uma palavra-chave reservada.
“Uai Luiz, então se eu desabilitar essa opção não vou conseguir mais utilizar uma palavra-chave reservada no nome de um identificador?”
Calma, no link da Documentação Oficial da Microsoft do início do post tem uma OBSERVAÇÃO:
Vamos fazer esse último teste então:
1 2 3 4 5 6 7 8 9 |
DROP TABLE [INDEX] CREATE TABLE [INDEX] ( ID INT) INSERT INTO [INDEX] VALUES (1),(2),(3),(4),(5) SELECT * FROM [INDEX] |
Conclusão:
Acredito que essa opção seja útil quando precisarmos gerar um script e executar em outro ambiente / banco de dados, desde que ele também siga as regras ISO.
Espero que você tenha aprendido algo até aqui. Por fim, vamos resumir os conceitos:
SET QUOTED_IDENTIFIER ON:
STRING (TEXTO) – Pode utilizar apenas as ‘aspas simples’ como delimitador.
IDENTIFICADORES – Pode utilizar as “aspas duplas” como delimitador para representar palavras-chave reservadas.
SET QUOTED_IDENTIFIER OFF:
STRING (TEXTO) – Pode utilizar as ‘aspas simples’ e “aspas duplas” como delimitador.
IDENTIFICADORES – NÃO pode utilizar as “aspas duplas” como delimitador para representar palavras-chave reservadas. Nesse caso, você pode recorrer aos [colchetes] como delimitadores.
Referências:
Segue mais alguns posts como referência sobre o assunto:
https://www.dirceuresende.com/blog/os-comandos-set-do-sql-server/
Espero que tenha gostado e que isso também possa ser útil no seu dia a dia. Até o próximo post!
Me siga no LinkedIn e YouTube para ficar por dentro das novidades.
Abraço,
Luiz Vitor França Lima
Consultor SQL Server
Pingback: Casos do Dia a Dia – UPDATE failed because the following SET options have incorrect settings ‘QUOTED_IDENTIFIER’ – Luiz Lima
Muito bom !
Olá Renan, blz? Fico feliz em ajudar. =)
Abraço,
Luiz Vitor