Ето моят собствен отговор на този въпрос (Моля, вижте и актуализацията в края):
Не, няма такъв унарен оператор, дефиниран в 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)
оператор, приложен към низ. Не мога да си представя никаква употреба!
АКТУАЛИЗАЦИЯ
Тук се казва, че това е грешка в по-ранните версии, но няма да бъде коригирана поради обратна съвместимост: