Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Comprendre QUOTED_IDENTIFIER

Vous cherchez à comprendre QUOTED_IDENTIFIER Je vais poster une compréhension ici.

Version courte

L'ANSI a exigé que les guillemets soient utilisés autour des identificateurs (et non autour des chaînes). SQL Server a pris en charge les deux :

SQL Server à l'origine :

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

ANSI (c'est-à-dire SET QUOTED_IDENTIFIER ON ):

  • SELECT "Hello, world!" --le guillemet n'est plus valide dans ANSI autour des chaînes
  • SELECT 'Hello, world!' --apostrophe
  • CREATE TABLE "The world's most awful table name" ("Hello, world!" int)
  • SELECT "Hello, world!" FROM "The world's most awful table name"

Version longue

À l'origine, SQL Server vous permettait d'utiliser des guillemets ("..." ) et apostrophes ('...' ) autour des chaînes de manière interchangeable (comme le fait Javascript) :

  • SELECT "Hello, world!" --guillemet
  • SELECT 'Hello, world!' --apostrophe

Et si vous vouliez une table de noms, une vue, une procédure, une colonne, etc. avec quelque chose qui violerait autrement toutes les règles de dénomination des objets, vous pourriez l'envelopper entre crochets ([ , ] ):

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

Et tout cela a fonctionné et avait du sens.

Puis vint l'ANSI

Puis l'ANSI est arrivé et a eu d'autres idées :

  • si vous avez un nom funky, placez-le entre guillemets ("..." )
  • utiliser apostrophe ('...' ) pour les chaînes
  • et nous ne nous soucions même pas de vos crochets

Ce qui signifie que si vous vouliez "citer" une colonne funky ou un nom de table, vous devez utiliser des guillemets :

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

Si vous connaissiez SQL Server, vous saviez que les guillemets étaient déjà utilisés pour représenter des chaînes. Si vous avez essayé aveuglément d'exécuter ce ANSI-SQL comme s'il s'agissait de T-SQL :c'est un non-sens, et SQL Server vous l'a dit :

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

C'est l'équivalent moral d'essayer d'exécuter :

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

Ce qui revient à exécuter :

SELECT 'string' FROM 'string'

Vous devez accepter le nouveau comportement ANSI

Microsoft a donc ajouté une fonctionnalité pour vous permettre d'accepter la version ANSI de SQL.

Original (ou QUOTED_IDENTIFIER éteint) :

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

ACTIVER QUOTED_IDENTIFIER :

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

SQL Server vous permet toujours d'utiliser [square brackets] , plutôt que de vous forcer à utiliser des "quotation marks" . Mais avec QUOTED_IDENTIFIER activé, vous ne pouvez pas utilisez "double quote quotation mark around strings" , vous ne devez utiliser que 'the single quote apostrophe' .