sql >> Databáze >  >> RDS >> Sqlserver

Vysvětlení QUOTED_IDENTIFIER

Hledáte pochopení QUOTED_IDENTIFIER zde pošlu nějaké porozumění.

Krátká verze

ANSI požadovala, aby se kolem identifikátorů (nikoli kolem řetězců) používaly uvozovky. SQL Server podporoval obojí:

SQL Server původně:

  • SELECT "Hello, world!" -uvozovky
  • 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 (tj. SET QUOTED_IDENTIFIER ON ):

  • SELECT "Hello, world!" --uvozovky již nejsou platné v ANSI kolem řetězců
  • 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"

Dlouhá verze

Původně SQL Server umožňoval používat uvozovky ("..." ) a apostrofy ('...' ) kolem řetězců zaměnitelně (jako to dělá Javascript):

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

A pokud byste chtěli jmennou tabulku, pohled, proceduru, sloupec atd. s něčím, co by jinak porušovalo všechna pravidla pojmenovávání objektů, můžete to zabalit do hranatých závorek ([ , ] ):

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

A to vše fungovalo a dávalo smysl.

Potom přišla ANSI

Pak přišla ANSI a měla jiné nápady:

  • máte-li funky jméno, dejte jej do uvozovek ("..." )
  • použijte apostrof ('...' ) pro struny
  • a vaše hranaté závorky nás ani nezajímají

Což znamená, že pokud byste chtěli "citovat" funky název sloupce nebo tabulky, musíte použít uvozovky:

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

Pokud jste znali SQL Server, věděli jste, že uvozovky byly již používány k reprezentaci řetězců. Pokud jste se slepě pokusili spustit tento ANSI-SQL jako by to bylo T-SQL :to je nesmysl a SQL Server vám to řekl:

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

Je to morální ekvivalent pokusu o provedení:

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

Což je jako provedení:

SELECT 'string' FROM 'string'

Musíte se přihlásit k novému chování ANSI

Microsoft tedy přidal funkci, která vám umožní přihlásit se k verzi ANSI SQL.

Původní (nebo QUOTED_IDENTIFIER vypnuto) :

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

NASTAVIT QUOTED_IDENTIFIER ZAPNUTO :

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

SQL Server vám stále umožňuje používat [square brackets] místo toho, abyste vás nutili používat "quotation marks" . Ale se zapnutým QUOTED_IDENTIFIER to nemůžete použijte "double quote quotation mark around strings" , musíte použít pouze 'the single quote apostrophe' .



  1. Přehled komprese dat v SQL Server

  2. Získání seznamu dat v rozsahu v PostgreSQL

  3. 5 věcí, které byste měli vědět o „Windows 10 S“

  4. CHYBA PostgreSQL:zrušení příkazu kvůli konfliktu s obnovou