Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

QUOTED_IDENTIFIER verstehen

Suchen Sie nach einem Verständnis von QUOTED_IDENTIFIER Ich werde hier etwas Verständnis posten.

Kurzversion

ANSI forderte, dass Anführungszeichen um Bezeichner (nicht um Zeichenfolgen) verwendet werden. SQL Server unterstützte beides:

SQL-Server ursprünglich:

  • SELECT "Hello, world!" --Anführungszeichen
  • SELECT 'Hello, world!' --Apostroph
  • CREATE TABLE [The world's most awful table name] ([Hello, world!] int)
  • SELECT [Hello, world!] FROM [The world's most awful table name]

ANSI (z. B. SET QUOTED_IDENTIFIER ON ):

  • SELECT "Hello, world!" --Anführungszeichen nicht mehr gültig in ANSI um Zeichenfolgen
  • SELECT 'Hello, world!' --Apostroph
  • CREATE TABLE "The world's most awful table name" ("Hello, world!" int)
  • SELECT "Hello, world!" FROM "The world's most awful table name"

Langversion

Ursprünglich erlaubte Ihnen SQL Server die Verwendung von Anführungszeichen ("..." ) und Apostrophe ('...' ) um Zeichenfolgen austauschbar (wie es Javascript tut):

  • SELECT "Hello, world!" --Anführungszeichen
  • SELECT 'Hello, world!' --Apostroph

Und wenn Sie eine Tabelle, eine Ansicht, eine Prozedur, eine Spalte usw. mit etwas benennen möchten, das ansonsten gegen alle Regeln der Benennung von Objekten verstoßen würde, können Sie es in eckige Klammern einschließen ([ , ] ):

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

Und das alles funktionierte und machte Sinn.

Dann kam ANSI

Dann kam ANSI und hatte andere Ideen:

  • Wenn Sie einen ausgefallenen Namen haben, schließen Sie ihn in Anführungszeichen ein ("..." )
  • benutze Apostroph ('...' ) für Zeichenfolgen
  • und wir kümmern uns nicht einmal um Ihre eckigen Klammern

Das heißt, wenn Sie "zitieren" wollten Bei einem ungewöhnlichen Spalten- oder Tabellennamen müssen Sie Anführungszeichen verwenden:

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

Wenn Sie SQL Server kannten, kannten Sie diese Anführungszeichen wurden bereits zur Darstellung von Zeichenfolgen verwendet. Wenn Sie blind versucht haben, dieses ANSI-SQL auszuführen als wäre es T-SQL :Es ist Unsinn, und SQL Server hat es Ihnen gesagt:

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

Es ist das moralische Äquivalent zu dem Versuch, Folgendes auszuführen:

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

Das ist wie das Ausführen von:

SELECT 'string' FROM 'string'

Sie müssen sich für das neue ANSI-Verhalten anmelden

Daher hat Microsoft eine Funktion hinzugefügt, mit der Sie sich für die ANSI-Variante von SQL anmelden können.

Original (oder QUOTED_IDENTIFIER aus) :

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

QUOTED_IDENTIFIER EINSTELLEN :

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

SQL Server lässt Sie weiterhin [square brackets] verwenden , anstatt Sie zu zwingen, "quotation marks" zu verwenden . Aber mit QUOTED_IDENTIFIER ON ist das nicht möglich Verwenden Sie "double quote quotation mark around strings" , dürfen Sie nur 'the single quote apostrophe' verwenden .