Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Noções básicas sobre QUOTED_IDENTIFIER


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!" --aspas
  • SELECT 'Hello, world!' --apóstrofe
  • CREATE 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 strings
  • SELECT 'Hello, world!' --apóstrofe
  • CREATE 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!" --aspas
  • SELECT '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' .