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' .