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ørselstegnSELECT '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!"
--anførselstegn ikke længere gyldigt i ANSI omkring strengeSELECT '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"
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ørselstegnSELECT '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'
.