sql >> Database >  >> RDS >> Sqlserver

QUOTED_IDENTIFIER begrijpen

Op zoek naar inzicht in QUOTED_IDENTIFIER ik zal hier wat begrip posten.

Korte versie

ANSI eiste dat aanhalingstekens worden gebruikt rond identifiers (niet rond strings). SQL Server ondersteunde beide:

SQL-server oorspronkelijk:

  • SELECT "Hello, world!" --aanhalingsteken
  • 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 (d.w.z. SET QUOTED_IDENTIFIER ON ):

  • SELECT "Hello, world!" --aanhalingsteken niet langer geldig in ANSI rond strings
  • 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"

Lange versie

Oorspronkelijk stond SQL Server u toe om aanhalingstekens te gebruiken ("..." ) en apostrofs ('...' ) rond strings door elkaar (zoals Javascript doet):

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

En als u een naamtabel, weergave, procedure, kolom enz. wilde hebben met iets dat anders alle regels voor het benoemen van objecten zou schenden, dan zou u het tussen vierkante haken kunnen plaatsen ([ , ] ):

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

En dat werkte allemaal en was logisch.

Toen kwam ANSI

Toen kwam ANSI langs en had andere ideeën:

  • als je een funky naam hebt, plaats deze dan tussen aanhalingstekens ("..." )
  • gebruik apostrof ('...' ) voor tekenreeksen
  • en we geven niet eens om je vierkante haken

Wat betekent dat als je wilt "citeren" een funky kolom- of tabelnaam moet u aanhalingstekens gebruiken:

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

Als u SQL Server kende, wist u dat aanhalingstekens werden al gebruikt om strings weer te geven. Als u blindelings probeerde die ANSI-SQL . uit te voeren alsof het T-SQL . is :het is onzin, en SQL Server heeft je dat verteld:

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

Het is het morele equivalent van proberen uit te voeren:

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

Dat is hetzelfde als uitvoeren:

SELECT 'string' FROM 'string'

U moet zich aanmelden voor het nieuwe ANSI-gedrag

Daarom heeft Microsoft een functie toegevoegd waarmee u zich kunt aanmelden voor de ANSI-smaak van SQL.

Origineel (of QUOTED_IDENTIFIER uit) :

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

STEL QUOTED_IDENTIFIER IN :

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

Met SQL Server kunt u nog steeds [square brackets] . gebruiken , in plaats van u te dwingen "quotation marks" te gebruiken . Maar met QUOTED_IDENTIFIER AAN, kunt u niet gebruik "double quote quotation mark around strings" , je mag alleen 'the single quote apostrophe' . gebruiken .



  1. Hoe strftime en datetime correct te gebruiken met behulp van de Room-bibliotheek?

  2. Oracle 12c GEDENTIFICEERD DOOR WAARDEN

  3. Laravel Welsprekende groep volgens meest recente record

  4. PHP PDO - Aantal rijen