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:
SELECT "Hello, world!"
--comillasSELECT '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 (es decir, SET QUOTED_IDENTIFIER ON
):
SELECT "Hello, world!"
--las comillas ya no son válidas en ANSI alrededor de cadenasSELECT '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"
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!"
--comillasSELECT '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'
.