sql >> Databasteknik >  >> RDS >> Sqlserver

Förstå QUOTED_IDENTIFIER

Letar efter en förståelse för QUOTED_IDENTIFIER Jag kommer att lägga upp lite förståelse här.

Kort version

ANSI krävde att citattecken skulle användas runt identifierare (inte runt strängar). SQL Server stödde båda:

SQL-server ursprungligen:

  • SELECT "Hello, world!" --citattecken
  • 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!" --citattecken är inte längre giltigt i ANSI runt strängar
  • 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"

Lång version

Ursprungligen tillät SQL Server dig att använda citattecken ("..." ) och apostrof ('...' ) runt strängar omväxlande (som Javascript gör):

  • SELECT "Hello, world!" --citattecken
  • SELECT 'Hello, world!' --apostrof

Och om du ville ha en namntabell, vy, procedur, kolumn etc med något som annars skulle bryta mot alla regler för namngivning av objekt, kan du slå in det inom hakparenteser ([ , ] ):

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

Och allt fungerade och var vettigt.

Sedan kom ANSI

Sedan kom ANSI och hade andra idéer:

  • om du har ett häftigt namn, slå in det i citattecken ("..." )
  • använd apostrof ('...' ) för strängar
  • och vi bryr oss inte ens om dina hakparenteser

Vilket betyder att om du vill "citera" ett funky kolumn- eller tabellnamn måste du använda citattecken:

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

Om du kände till SQL Server visste du att citattecken användes redan för att representera strängar. Om du blint försökte köra den ANSI-SQL som om det vore T-SQL :det är nonsens, och SQL Server sa till dig det:

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

Det är den moraliska motsvarigheten till att försöka utföra:

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

Vilket är som att köra:

SELECT 'string' FROM 'string'

Du måste välja att använda det nya ANSI-beteendet

Så Microsoft lade till en funktion som låter dig välja ANSI-smaken av SQL.

Original (eller QUOTED_IDENTIFIER av) :

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

STÄLL PÅ QUOTED_IDENTIFIER :

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

SQL Server låter dig fortfarande använda [square brackets] , istället för att tvinga dig att använda "quotation marks" . Men med QUOTED_IDENTIFIER PÅ kan du inte använd "double quote quotation mark around strings" , du får bara använda 'the single quote apostrophe' .



  1. Hur man listar alla användare i PostgreSQL

  2. Vad är skillnaden mellan Integrated Security =True och Integrated Security =SSPI?

  3. Hur UTOM Fungerar i SQL Server

  4. Vad är det bästa sättet att infoga och uppdatera en enradstabell i MySQL?