Sqlserver
 sql >> Teknologi Basis Data >  >> RDS >> Sqlserver

SQL Server:+ (unary) operator pada String non-numerik

Inilah jawaban saya sendiri untuk pertanyaan ini (Silakan lihat juga pembaruan di akhir):

Tidak, tidak ada operator unary yang didefinisikan pada ekspresi String. Ada kemungkinan bahwa ini adalah bug.

Penjelasan:

Pernyataan yang diberikan valid dan menghasilkan hasil di bawah ini:

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

yang setara dengan melakukan SELECT pernyataan tanpa menggunakan + tanda:

SELECT  'ABCDEF'

Dikompilasi tanpa memberikan kesalahan apa pun, pada kenyataannya dieksekusi dengan sukses, memberi kesan bahwa + beroperasi sebagai Unary operasi pada string yang diberikan. Namun, dalam T-SQL resmi dokumentasi, tidak disebutkan operator semacam itu. Bahkan, di bagian berjudul "Operator String ", + muncul dalam dua operasi String yaitu + (String Concatenation) dan += (String Concatenation); tetapi juga bukan Unary operasi. Juga, di bagian berjudul "Operator Unary ", tiga operator telah diperkenalkan, hanya satu dari mereka yang + (Positive) operator. Namun, untuk satu-satunya ini yang tampaknya relevan, segera menjadi jelas bahwa operator ini juga tidak ada hubungannya dengan nilai string non-numerik sebagai penjelasan untuk + (Positive) operator secara eksplisit menyatakan bahwa operator ini hanya berlaku untuk nilai numerik:"Mengembalikan nilai dari ekspresi numerik (operator unary) ".

Mungkin, operator ini ada untuk berhasil menerima nilai string yang berhasil dievaluasi sebagai angka seperti yang telah digunakan di sini:

SELECT  +'12345'+1

Ketika pernyataan di atas dijalankan, itu menghasilkan angka dalam output yang merupakan jumlah dari kedua string yang diberikan dievaluasi sebagai angka dan nilai numerik yang ditambahkan ke dalamnya, yaitu 1 di sini tapi itu jelas bisa menjadi jumlah lain:

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

Namun, saya ragu penjelasan ini benar karena menimbulkan pertanyaan di bawah ini:

Pertama, jika kita menerima bahwa penjelasan ini benar, maka kita dapat menyimpulkan bahwa ekspresi seperti +'12345' dievaluasi menjadi angka. Jika demikian, mengapa angka-angka ini dapat muncul dalam fungsi terkait string seperti DATALENGTH , LEN , dll. Anda bisa melihat pernyataan seperti ini:

  SELECT  DATALENGTH(+'12345')

cukup valid dan hasilnya sebagai berikut:

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

yang artinya +'12345' sedang dievaluasi sebagai string bukan angka. Bagaimana ini bisa dijelaskan?

Kedua, sementara pernyataan serupa dengan - operator, seperti ini:

 `SELECT  -'ABCDE'` 

atau bahkan ini:

`SELECT  -'12345'` 

hasilkan kesalahan di bawah ini:

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

Mengapa, tidakkah itu menghasilkan kesalahan untuk kasus serupa ketika + operator telah salah digunakan dengan nilai string non-numerik?

Jadi, dua pertanyaan ini mencegah saya menerima penjelasan bahwa ini adalah + (unary) yang sama operator yang telah diperkenalkan dalam dokumentasi untuk nilai numerik. Karena tidak ada penyebutan lain di tempat lain, bisa jadi itu sengaja ditambahkan ke bahasa. Mungkin bug.

Masalahnya terlihat lebih parah ketika kita melihat tidak ada kesalahan yang dihasilkan untuk pernyataan seperti ini:

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

Saya tidak tahu apakah ada bahasa pemrograman lain di luar sana yang menerima pernyataan semacam ini. Tetapi jika ada, alangkah baiknya untuk mengetahui untuk tujuan apa mereka menggunakan + (unary) operator diterapkan ke string. Saya tidak bisa membayangkan penggunaan apa pun!

PERBARUI

Di sini dikatakan ini adalah bug di versi sebelumnya tetapi tidak akan diperbaiki karena kompatibilitas ke belakang:

Setelah beberapa penyelidikan, perilaku ini memang disengaja karena + adalah operator unary. Jadi parser menerima "+ , dan '+' diabaikan begitu saja dalam kasus ini. Mengubah perilaku ini memiliki banyak implikasi kompatibilitas mundur sehingga kami tidak bermaksud untuk mengubahnya &perbaikan akan memperkenalkan perubahan yang tidak perlu untuk kode aplikasi.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Kinerja penerapan luar dengan fungsi

  2. Cara lebih baik menduplikasi satu set data di SQL Server

  3. Bagaimana cara memperbarui tabel besar dengan jutaan baris di SQL Server?

  4. Cara Mendapatkan Semua Tabel yang Memiliki Batasan Kunci Utama Dibuat di Database SQL Server - Tutorial SQL Server / TSQL 57

  5. SQL Server:Dapatkan kunci utama tabel menggunakan kueri sql