Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

Hiểu QUOTED_IDENTIFIER

Tìm kiếm sự hiểu biết về QUOTED_IDENTIFIER tôi sẽ đăng một số hiểu biết ở đây.

Phiên bản ngắn

ANSI yêu cầu rằng dấu ngoặc kép được sử dụng xung quanh số nhận dạng (không xung quanh chuỗi). SQL Server hỗ trợ cả hai:

Máy chủ SQL ban đầu:

  • SELECT "Hello, world!" - dấu ngoặc kép
  • 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 (tức là SET QUOTED_IDENTIFIER ON ):

  • SELECT "Hello, world!" - dấu ngoặc kép không còn hợp lệ trong ANSI xung quanh chuỗi
  • 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"

Phiên bản Dài

Ban đầu, SQL Server cho phép bạn sử dụng dấu ngoặc kép ("..." ) và dấu nháy đơn ('...' ) xung quanh các chuỗi có thể thay thế cho nhau (giống như Javascript):

  • SELECT "Hello, world!" - dấu ngoặc kép
  • SELECT 'Hello, world!' --apostrophe

Và nếu bạn muốn một bảng tên, chế độ xem, thủ tục, cột, v.v. có nội dung nào đó có thể vi phạm tất cả các quy tắc đặt tên đối tượng, bạn có thể đặt nó trong dấu ngoặc vuông ([ , ] ):

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

Và tất cả đều hoạt động và có ý nghĩa.

Sau đó là ANSI

Sau đó ANSI ra đời và có những ý tưởng khác:

  • nếu bạn có một cái tên thú vị, hãy đặt nó trong dấu ngoặc kép ("..." )
  • sử dụng dấu nháy đơn ('...' ) cho chuỗi
  • và chúng tôi thậm chí không quan tâm đến dấu ngoặc vuông của bạn

Có nghĩa là nếu bạn muốn "trích dẫn" một cột hoặc tên bảng thú vị mà bạn phải sử dụng dấu ngoặc kép:

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

Nếu bạn biết SQL Server, bạn biết rằng dấu ngoặc kép đã được sử dụng để đại diện cho các chuỗi. Nếu bạn cố gắng thực thi ANSI-SQL đó một cách mù quáng như thể nó là T-SQL :nó vô nghĩa và SQL Server đã nói với bạn như vậy:

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

Nó tương đương với đạo đức của việc cố gắng thực hiện:

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

Điều này giống như thực thi:

SELECT 'string' FROM 'string'

Bạn phải chọn tham gia hành vi ANSI mới

Vì vậy, Microsoft đã thêm một tính năng để cho phép bạn chọn tham gia phiên bản ANSI của SQL.

Bản gốc (hoặc QUOTED_IDENTIFIER tắt) :

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

BẬT QUOTED_IDENTIFIER :

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

SQL Server vẫn cho phép bạn sử dụng [square brackets] , thay vì buộc bạn sử dụng "quotation marks" . Nhưng với QUOTED_IDENTIFIER ON, bạn không thể sử dụng "double quote quotation mark around strings" , bạn chỉ được sử dụng '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. Đọc cấu hình .NET từ cơ sở dữ liệu

  2. Máy chủ SQL bỏ qua trường hợp trong một biểu thức where

  3. Làm thế nào để loại bỏ ràng buộc mặc định của SQL mà không cần biết tên của nó?

  4. Sự khác biệt về hiệu suất chính giữa kiểu dữ liệu SQL Server varchar và nvarchar là gì?

  5. Cách sử dụng mệnh đề Where trong Câu lệnh Chọn trong SQL Server - Hướng dẫn SQL Server / TSQL Phần 109