Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Zrozumienie QUOTED_IDENTIFIER

Szukasz zrozumienia QUOTED_IDENTIFIER zamieszczę tutaj trochę zrozumienia.

Krótka wersja

ANSI zażądało, aby wokół identyfikatorów (nie wokół ciągów) używano cudzysłowów. SQL Server obsługuje oba:

Serwer SQL pierwotnie:

  • SELECT "Hello, world!" -- cudzysłów
  • 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!" --cudzysłów nie jest już ważny w ANSI wokół ciągów
  • 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"

Długa wersja

Pierwotnie SQL Server pozwalał na używanie znaków cudzysłowu ("..." ) i apostrofy ('...' ) wokół ciągów zamiennie (tak jak robi to Javascript):

  • SELECT "Hello, world!" -- cudzysłów
  • SELECT 'Hello, world!' --apostrof

A jeśli chcesz mieć tabelę nazw, widok, procedurę, kolumnę itp. z czymś, co inaczej naruszałoby wszystkie zasady nazewnictwa obiektów, możesz umieścić je w nawiasach kwadratowych ([ , ] ):

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

I to wszystko działało i miało sens.

Potem przyszedł ANSI

Potem pojawił się ANSI i miał inne pomysły:

  • jeśli masz ciekawą nazwę, zawiń ją w cudzysłów ("..." )
  • użyj apostrofu ('...' ) dla ciągów
  • i nie dbamy nawet o Twoje nawiasy kwadratowe

Co oznacza, że ​​jeśli chcesz „cytować” zabawna nazwa kolumny lub tabeli, której należy użyć cudzysłowów:

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

Jeśli znałeś SQL Server, wiedziałeś, że cudzysłów były już używane do reprezentowania ciągów. Jeśli próbowałeś na ślepo wykonać ten ANSI-SQL jakby to był T-SQL :to bzdura, a SQL Server tak powiedział:

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

Jest to moralny odpowiednik próby wykonania:

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

To jest jak wykonywanie:

SELECT 'string' FROM 'string'

Musisz wyrazić zgodę na nowe zachowanie ANSI

Dlatego firma Microsoft dodała funkcję, która umożliwia korzystanie ze smaków SQL ANSI.

Oryginał (lub QUOTED_IDENTIFIER wyłączone) :

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

WŁĄCZ QUOTED_IDENTIFIER :

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

SQL Server nadal pozwala używać [square brackets] , zamiast zmuszać Cię do używania "quotation marks" . Ale przy włączonym QUOTED_IDENTIFIER nie możesz użyj "double quote quotation mark around strings" , należy używać tylko 'the single quote apostrophe' .



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak pobrać nazwy pól z tabeli tymczasowej (SQL Server 2008)

  2. Nie używaj sp_depends w SQL Server (jest przestarzałe)

  3. SQL Server sprawdza rozróżnianie wielkości liter?

  4. Jak bezpiecznie przechowywać hasła w bazie danych?

  5. SQL Server:SUM() wielu wierszy, w tym klauzule where