sql >> Base de Datos >  >> RDS >> Sqlserver

Información sobre QUOTED_IDENTIFIER

Buscando una comprensión de QUOTED_IDENTIFIER Publicaré algo de entendimiento aquí.

Versión corta

ANSI exigió que se usaran comillas alrededor de los identificadores (no alrededor de las cadenas). SQL Server admite ambos:

Servidor SQL originalmente:

  • SELECT "Hello, world!" --comillas
  • 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 (es decir, SET QUOTED_IDENTIFIER ON ):

  • SELECT "Hello, world!" --las comillas ya no son válidas en ANSI alrededor de cadenas
  • 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"

Versión larga

Originalmente, SQL Server le permitía usar comillas ("..." ) y apóstrofes ('...' ) alrededor de cadenas indistintamente (como lo hace Javascript):

  • SELECT "Hello, world!" --comillas
  • SELECT 'Hello, world!' --apóstrofe

Y si quisiera una tabla de nombre, vista, procedimiento, columna, etc. con algo que de otro modo violaría todas las reglas de nomenclatura de objetos, podría envolverlo entre corchetes ([ , ] ):

CREATE TABLE [The world's most awful table name] ([Hello, world!] int)
SELECT [Hello, world!] FROM [The world's most awful table name]

Y todo funcionó y tenía sentido.

Luego vino ANSI

Luego apareció ANSI y tuvo otras ideas:

  • si tiene un nombre raro, enciérrelo entre comillas ("..." )
  • usar apóstrofe ('...' ) para cadenas
  • y ni siquiera nos importan los corchetes

Lo que significa que si quisieras "citar" un nombre original de columna o tabla debe usar comillas:

SELECT "Hello, world!" FROM "The world's most awful table name"

Si conocía SQL Server, sabía que comillas ya se estaban utilizando para representar cadenas. Si intentaste ciegamente ejecutar ese ANSI-SQL como si fuera T-SQL :es una tontería, y SQL Server te lo dijo:

Msg 102, Level 15, State 1, Line 8
Incorrect syntax near 'The world's most awful table name'.

Es el equivalente moral de intentar ejecutar:

SELECT 'Hello, world!' FROM 'The world''s most awful table name'

Que es como ejecutar:

SELECT 'string' FROM 'string'

Debe optar por el nuevo comportamiento ANSI

Entonces, Microsoft agregó una función que le permite optar por la versión ANSI de SQL.

Originales (o QUOTED_IDENTIFIER apagado) :

SELECT "Hello, world!" --valid
SELECT 'Hello, world!' --valid

ACTIVAR QUOTED_IDENTIFIER :

SELECT "Hello, world!" --INVALID
SELECT 'Hello, world!' --valid

SQL Server aún le permite usar [square brackets] , en lugar de obligarte a usar "quotation marks" . Pero con QUOTED_IDENTIFIER ON, no puede use "double quote quotation mark around strings" , solo debe usar 'the single quote apostrophe' .