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

Forstå QUOTED_IDENTIFIER

Leder efter en forståelse af QUOTED_IDENTIFIER Jeg vil poste lidt forståelse her.

Kort version

ANSI krævede, at der blev brugt anførselstegn omkring identifikatorer (ikke omkring strenge). SQL Server understøttede begge dele:

SQL-server oprindeligt:

  • SELECT "Hello, world!" --anførselstegn
  • SELECT 'Hello, world!' --apostrof
  • CREATE TABLE [The world's most awful table name] ([Hello, world!] int)
  • SELECT [Hello, world!] FROM [The world's most awful table name]

ANSI (dvs. SET QUOTED_IDENTIFIER ON ):

  • SELECT "Hello, world!" --anførselstegn ikke længere gyldigt i ANSI omkring strenge
  • SELECT 'Hello, world!' --apostrof
  • CREATE TABLE "The world's most awful table name" ("Hello, world!" int)
  • SELECT "Hello, world!" FROM "The world's most awful table name"

Lang version

Oprindeligt tillod SQL Server dig at bruge anførselstegn ("..." ) og apostrof ('...' ) rundt om strenge i flæng (som Javascript gør):

  • SELECT "Hello, world!" --anførselstegn
  • SELECT 'Hello, world!' --apostrof

Og hvis du ville have en navnetabel, visning, procedure, kolonne osv. med noget, der ellers ville overtræde alle reglerne for navngivning af objekter, kunne du pakke det ind i kantede parenteser ([ , ] ):

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

Og det hele virkede og gav mening.

Så kom ANSI

Så kom ANSI og havde andre ideer:

  • hvis du har et funky navn, skal du pakke det ind i anførselstegn ("..." )
  • brug apostrof ('...' ) for strenge
  • og vi er ligeglade med dine firkantede parenteser

Hvilket betyder, at hvis du ville "citere" et funky kolonne- eller tabelnavn skal du bruge anførselstegn:

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

Hvis du kendte SQL Server, vidste du det anførselstegn blev allerede brugt til at repræsentere strenge. Hvis du blindt forsøgte at udføre den ANSI-SQL som om det var T-SQL :det er noget sludder, og SQL Server fortalte dig det:

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

Det er den moralske ækvivalent af at forsøge at udføre:

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

Hvilket er som at udføre:

SELECT 'string' FROM 'string'

Du skal tilmelde dig den nye ANSI-adfærd

Så Microsoft tilføjede en funktion, der giver dig mulighed for at tilmelde dig ANSI-varianten af ​​SQL.

Original (eller QUOTED_IDENTIFIER slukket) :

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

INDSTILL QUOTED_IDENTIFIER TIL :

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

SQL Server lader dig stadig bruge [square brackets] , i stedet for at tvinge dig til at bruge "quotation marks" . Men med QUOTED_IDENTIFIER TIL, kan du ikke brug "double quote quotation mark around strings" , må du kun bruge 'the single quote apostrophe' .



  1. MySQL vælg hvor lig med flere værdier

  2. Udbyderen er ikke kompatibel med versionen af ​​Oracle-klienten

  3. Rækkeversionering i MySQL

  4. Sådan fungerer Mod() i PostgreSQL