Procurando uma compreensão de
QUOTED_IDENTIFIER
vou postar algum entendimento aqui. Versão curta
O ANSI exigia que as aspas fossem usadas em identificadores (não em strings). O SQL Server deu suporte a ambos:
SQL Server originalmente:
SELECT "Hello, world!"
--aspasSELECT 'Hello, world!'
--apóstrofeCREATE TABLE [The world's most awful table name] ([Hello, world!] int)
SELECT [Hello, world!] FROM [The world's most awful table name]
ANSI (ou seja,
SET QUOTED_IDENTIFIER ON
):SELECT "Hello, world!"
--aspas não são mais válidas em ANSI em torno de stringsSELECT 'Hello, world!'
--apóstrofeCREATE TABLE "The world's most awful table name" ("Hello, world!" int)
SELECT "Hello, world!" FROM "The world's most awful table name"
Versão longa
Originalmente, o SQL Server permitia que você usasse aspas (
"..."
) e apóstrofos ('...'
) em torno de strings de forma intercambiável (como o Javascript faz):SELECT "Hello, world!"
--aspasSELECT 'Hello, world!'
--apóstrofe
E se você quiser uma tabela de nomes, visão, procedimento, coluna etc com algo que violaria todas as regras de nomenclatura de objetos, você poderia envolvê-lo em colchetes (
[
, ]
):CREATE TABLE [The world's most awful table name] ([Hello, world!] int)
SELECT [Hello, world!] FROM [The world's most awful table name]
E tudo isso funcionou e fez sentido.
Depois veio o ANSI
Então o ANSI apareceu e teve outras ideias:
- se você tiver um nome estranho, coloque-o entre aspas (
"..."
) - use apóstrofo (
'...'
) para strings - e nem nos importamos com seus colchetes
O que significa que se você quiser "cotar" uma coluna ou nome de tabela funky você deve usar aspas:
SELECT "Hello, world!" FROM "The world's most awful table name"
Se você conhecesse o SQL Server, sabia que as aspas já estavam sendo usados para representar strings. Se você tentou executar cegamente esse ANSI-SQL como se fosse T-SQL :é um absurdo, e o SQL Server lhe disse isso:
Msg 102, Level 15, State 1, Line 8
Incorrect syntax near 'The world's most awful table name'.
É o equivalente moral de tentar executar:
SELECT 'Hello, world!' FROM 'The world''s most awful table name'
O que é como executar:
SELECT 'string' FROM 'string'
Você deve aceitar o novo comportamento ANSI
Assim, a Microsoft adicionou um recurso para permitir que você opte pelo sabor ANSI do SQL.
Original (ou
QUOTED_IDENTIFIER
desligado) :SELECT "Hello, world!" --valid
SELECT 'Hello, world!' --valid
DEFINIR QUOTED_IDENTIFIER ATIVADO :
SELECT "Hello, world!" --INVALID
SELECT 'Hello, world!' --valid
O SQL Server ainda permite usar
[square brackets]
, em vez de forçá-lo a usar "quotation marks"
. Mas com QUOTED_IDENTIFIER ATIVADO, você não pode use "double quote quotation mark around strings"
, você deve usar apenas 'the single quote apostrophe'
.