Alla ricerca di una comprensione di QUOTED_IDENTIFIER
posterò un po' di comprensione qui.
Versione breve
ANSI ha richiesto che le virgolette fossero utilizzate attorno agli identificatori (non attorno alle stringhe). SQL Server supportava entrambi:
SQL Server originariamente:
SELECT "Hello, world!"
--virgoletteSELECT 'Hello, world!'
--apostrofoCREATE TABLE [The world's most awful table name] ([Hello, world!] int)
SELECT [Hello, world!] FROM [The world's most awful table name]
ANSI (es. SET QUOTED_IDENTIFIER ON
):
SELECT "Hello, world!"
--virgolette non più valide in ANSI attorno alle stringheSELECT 'Hello, world!'
--apostrofoCREATE TABLE "The world's most awful table name" ("Hello, world!" int)
SELECT "Hello, world!" FROM "The world's most awful table name"
Versione lunga
In origine, SQL Server consentiva di utilizzare virgolette ("..."
) e apostrofi ('...'
) attorno alle stringhe in modo intercambiabile (come fa Javascript):
SELECT "Hello, world!"
--virgoletteSELECT 'Hello, world!'
--apostrofo
E se desideri una tabella dei nomi, una vista, una procedura, una colonna ecc. con qualcosa che altrimenti violerebbe tutte le regole di denominazione degli oggetti, potresti racchiuderla tra parentesi quadre ([
, ]
):
CREATE TABLE [The world's most awful table name] ([Hello, world!] int)
SELECT [Hello, world!] FROM [The world's most awful table name]
E tutto ha funzionato e ha avuto un senso.
Poi è arrivato ANSI
Poi è arrivata ANSI e ha avuto altre idee:
- se hai un nome originale, racchiudilo tra virgolette (
"..."
) - usa apostrofo (
'...'
) per le stringhe - e non ci interessano nemmeno le parentesi quadre
Ciò significa che se volessi "citare" un nome di una colonna o di una tabella originale è necessario utilizzare le virgolette:
SELECT "Hello, world!" FROM "The world's most awful table name"
Se conoscevi SQL Server, sapevi che virgolette erano già utilizzati per rappresentare stringhe. Se hai tentato alla cieca di eseguire ANSI-SQL come se fosse T-SQL :è una sciocchezza e te l'ha detto SQL Server:
Msg 102, Level 15, State 1, Line 8
Incorrect syntax near 'The world's most awful table name'.
È l'equivalente morale del tentativo di eseguire:
SELECT 'Hello, world!' FROM 'The world''s most awful table name'
Che è come eseguire:
SELECT 'string' FROM 'string'
Devi aderire al nuovo comportamento ANSI
Quindi Microsoft ha aggiunto una funzionalità per consentirti di accettare la versione ANSI di SQL.
Originale (o QUOTED_IDENTIFIER
spento) :
SELECT "Hello, world!" --valid
SELECT 'Hello, world!' --valid
ATTIVARE QUOTED_IDENTIFIER :
SELECT "Hello, world!" --INVALID
SELECT 'Hello, world!' --valid
SQL Server ti consente comunque di utilizzare [square brackets]
, invece di costringerti a utilizzare "quotation marks"
. Ma con QUOTED_IDENTIFIER ATTIVO, non puoi usa "double quote quotation mark around strings"
, devi utilizzare solo 'the single quote apostrophe'
.