Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Capire QUOTED_IDENTIFIER

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!" --virgolette
  • SELECT 'Hello, world!' --apostrofo
  • 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. SET QUOTED_IDENTIFIER ON ):

  • SELECT "Hello, world!" --virgolette non più valide in ANSI attorno alle stringhe
  • SELECT 'Hello, world!' --apostrofo
  • CREATE 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!" --virgolette
  • SELECT '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' .