Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

SQL Server:+(унарен) оператор върху нечислови низове

Ето моят собствен отговор на този въпрос (Моля, вижте и актуализацията в края):

Не, няма такъв унарен оператор, дефиниран в String изразите. Възможно е това да е грешка.

Обяснение:

Даденото твърдение е валидно и генерира следния резултат:

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

което е еквивалентно на извършване на SELECT оператор без използване на + знак:

SELECT  'ABCDEF'

Като се компилира, без да дава никакви грешки, а всъщност се изпълнява успешно, създава впечатлението, че + работи като Unary операция върху дадения низ. Въпреки това, в официалния T-SQL документация, не се споменава такъв оператор. Всъщност в раздела, озаглавен „Оператори на низове “, + се появява в две операции с низове, които са + (String Concatenation) и += (String Concatenation); но нито един от тях не е Unary операция. Освен това в раздела, озаглавен „Унарни оператори ", са въведени три оператора, като само един от тях е + (Positive) оператор. Въпреки това, за този единствен, който изглежда уместен, скоро става ясно, че този оператор също няма нищо общо с нечисловите низови стойности като обяснението за + (Positive) оператор изрично посочва, че този оператор е приложим само за числови стойности:"Връща стойността на числов израз (унарен оператор) ".

Може би този оператор е там, за да приеме успешно тези низови стойности, които са успешно оценени като числа като този, който е използван тук:

SELECT  +'12345'+1

Когато горният оператор се изпълни, той генерира число в изхода, което е сумата от дадения низ, оценен като число, и числовата стойност, добавена към него, която е 1 тук, но очевидно може да е всяка друга сума:

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

Съмнявам се обаче, че това обяснение е правилното, тъй като повдига следните въпроси:

Първо, ако приемем, че това обяснение е вярно, тогава можем да заключим, че изрази като +'12345' се оценяват на числа. Ако е така, тогава защо тези числа могат да се показват във функции, свързани с низове, като DATALENGTH , LEN и т.н. Можете да видите изявление като това:

  SELECT  DATALENGTH(+'12345')

е напълно валиден и води до следното:

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

което означава +'12345' се оценява като низ, а не като число. Как може да се обясни това?

Второ, докато подобни изявления с - оператор, като този:

 `SELECT  -'ABCDE'` 

или дори това:

`SELECT  -'12345'` 

генерира следната грешка:

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

Защо, не трябва ли да генерира грешка за подобни случаи, когато + операторът е бил използван погрешно с нечислова стойност на низ?

И така, тези два въпроса ми пречат да приема обяснението, че това е едно и също + (unary) оператор, който е въведен в документацията за числови стойности. Тъй като никъде другаде не се споменава за него, може да е умишлено добавен към езика. Може да е грешка.

Проблемът изглежда по-сериозен, когато видим, че не се генерира грешка за изрази като този:

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

Не знам дали има други езици за програмиране, които приемат подобни твърдения. Но ако има, би било хубаво да знаем за каква(и) цел(и) използват + (unary) оператор, приложен към низ. Не мога да си представя никаква употреба!

АКТУАЛИЗАЦИЯ

Тук се казва, че това е грешка в по-ранните версии, но няма да бъде коригирана поради обратна съвместимост:

След известно проучване това поведение е проектирано тъй като + е унарен оператор. Така че анализаторът приема "+, а "+" просто се игнорира в този случай. Промяната на това поведение има много последици за обратната съвместимост, така че не възнамеряваме да го променяме и корекцията ще въведе ненужни промени в кода на приложението.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Обратно инженерство за диаграмиране на база данни във Visio с SQL Server 2008

  2. SqlException (0x80131904):Невалидно име на обект 'dbo.Categories'

  3. Неуспешно извикване на отдалечена процедура с sql сървър 2008 R2

  4. 7645 Нулев или празен предикат на пълен текст

  5. Изглед за идентифициране на групирани стойности или обект