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

SQL Server:Toán tử + (một ngôi) trên chuỗi không phải số

Đây là câu trả lời của riêng tôi cho câu hỏi này (Vui lòng xem thêm bản cập nhật ở cuối):

Không, không có toán tử một ngôi nào như vậy được xác định trên biểu thức Chuỗi. Có thể đây là một lỗi.

Giải thích:

Câu lệnh đã cho hợp lệ và nó tạo ra kết quả dưới đây:

(No column name) 
----------------
ABCDEF
(1 row(s) affected)

tương đương với thực hiện SELECT câu lệnh mà không sử dụng + ký tên:

SELECT  'ABCDEF'

Việc được biên dịch mà không có bất kỳ lỗi nào, trên thực tế được thực thi thành công, tạo ấn tượng rằng + đang hoạt động dưới dạng Unary hoạt động trên chuỗi đã cho. Tuy nhiên, trong T-SQL chính thức tài liệu, không có đề cập đến một toán tử như vậy. Trên thực tế, trong phần có tên " Toán tử chuỗi ", + xuất hiện trong hai hoạt động Chuỗi là + (String Concatenation)+= (String Concatenation); nhưng cũng không phải là Unary hoạt động. Ngoài ra, trong phần có tên " Toán tử đơn nguyên ", ba toán tử đã được giới thiệu, chỉ một trong số chúng là + (Positive) nhà điều hành. Tuy nhiên, đối với toán tử này chỉ có vẻ có liên quan, sẽ sớm trở nên rõ ràng rằng toán tử này cũng không liên quan gì đến các giá trị chuỗi không phải số như lời giải thích cho + (Positive) toán tử tuyên bố rõ ràng rằng toán tử này chỉ có thể áp dụng cho các giá trị số:" Trả về giá trị của một biểu thức số (toán tử một ngôi) ".

Có lẽ, toán tử này ở đó để chấp nhận thành công những giá trị chuỗi được đánh giá thành công dưới dạng số, chẳng hạn như giá trị đã được sử dụng ở đây:

SELECT  +'12345'+1

Khi câu lệnh trên được thực thi, nó tạo ra một số trong đầu ra là tổng của cả chuỗi đã cho được đánh giá là một số và giá trị số được thêm vào nó, là 1 ở đây nhưng rõ ràng có thể là bất kỳ số tiền nào khác:

(No column name) 
----------------
12346
(1 row(s) affected)

Tuy nhiên, tôi nghi ngờ lời giải thích này là đúng vì nó đặt ra những câu hỏi dưới đây:

Thứ nhất, nếu chúng tôi chấp nhận rằng lời giải thích này là đúng, thì chúng tôi có thể kết luận rằng các biểu thức như +'12345' được đánh giá thành số. Nếu vậy thì tại sao những con số này có thể xuất hiện trong các hàm liên quan đến chuỗi, chẳng hạn như DATALENGTH , LEN , v.v. Bạn có thể thấy một tuyên bố như sau:

  SELECT  DATALENGTH(+'12345')

khá hợp lệ và kết quả như sau:

 (No column name) 
----------------
5
(1 row(s) affected)

có nghĩa là +'12345' đang được đánh giá là một chuỗi không phải là một số. Điều này có thể được giải thích như thế nào?

Thứ hai, trong khi các câu lệnh tương tự với - toán tử, chẳng hạn như sau:

 `SELECT  -'ABCDE'` 

hoặc thậm chí thế này:

`SELECT  -'12345'` 

tạo ra lỗi dưới đây:

Invalid operator for data type. Operator equals minus, type equals varchar.

Tại sao, nó sẽ không tạo ra lỗi cho các trường hợp tương tự khi + toán tử đã được sử dụng sai với một giá trị chuỗi không phải là số?

Vì vậy, hai câu hỏi này ngăn tôi chấp nhận lời giải thích rằng đây là + (unary) giống nhau toán tử đã được giới thiệu trong tài liệu cho các giá trị số. Vì không có bất kỳ đề cập nào khác về nó ở bất cứ nơi nào khác, có thể là nó được cố tình thêm vào ngôn ngữ. Có thể là một lỗi.

Vấn đề có vẻ nghiêm trọng hơn khi chúng tôi không thấy lỗi nào được tạo ra cho các câu lệnh chẳng hạn như câu lệnh này:

SELECT ++++++++'ABCDE'

Tôi không biết liệu có bất kỳ ngôn ngữ lập trình nào khác chấp nhận những câu lệnh kiểu này không. Nhưng nếu có, sẽ rất tuyệt nếu biết (các) mục đích họ sử dụng + (unary) toán tử được áp dụng cho một chuỗi. Tôi không thể tưởng tượng bất kỳ cách sử dụng!

CẬP NHẬT

Ở đây nó cho biết đây là một lỗi trong các phiên bản trước nhưng nó sẽ không được sửa vì khả năng tương thích ngược:

Sau một số điều tra, hành vi này là do thiết kế vì + là một toán tử một ngôi. Vì vậy, trình phân tích cú pháp chấp nhận "+ và '+' chỉ đơn giản là bị bỏ qua trong trường hợp này. Việc thay đổi hành vi này có nhiều tác động tương thích ngược nên chúng tôi không có ý định thay đổi nó và bản sửa lỗi sẽ đưa ra những thay đổi không cần thiết cho mã ứng dụng.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Bí danh cơ sở dữ liệu chéo SQL Server

  2. Hệ thống phân cấp công nghệ bộ nhớ / lưu trữ và SQL Server

  3. Danh sách tất cả các cột chỉ mục &chỉ mục trong SQL Server DB

  4. Tạo bảng HTML với SQL FOR XML

  5. Làm thế nào để kịch bản vai trò cơ sở dữ liệu máy chủ SQL?