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!"
--citatteckenSELECT 'Hello, world!'
--apostrofCREATE 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ängarSELECT 'Hello, world!'
--apostrofCREATE 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!"
--citatteckenSELECT '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'
.