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łówSELECT 'Hello, world!'
--apostrofCREATE 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ówSELECT 'Hello, world!'
--apostrofCREATE 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łówSELECT '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'
.