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