Oto moja własna odpowiedź na to pytanie (proszę zapoznać się również z aktualizacją na końcu):
Nie, nie ma takiego jednoargumentowego operatora zdefiniowanego w wyrażeniach String. Możliwe, że to błąd.
Wyjaśnienie:
Podana instrukcja jest poprawna i generuje następujący wynik:
(No column name)
----------------
ABCDEF
(1 row(s) affected)
co jest równoważne wykonaniu SELECT
oświadczenie bez użycia +
znak:
SELECT 'ABCDEF'
Kompilacja bez podania błędów, a właściwie pomyślne wykonanie, sprawia wrażenie, że +
działa jako Unary
operacja na podanym ciągu. Jednak w oficjalnym T-SQL
dokumentacji, nie ma wzmianki o takim operatorze. W rzeczywistości w sekcji zatytułowanej „Operatory ciągów
", +
pojawia się w dwóch operacjach na ciągach, które są + (String Concatenation)
i += (String Concatenation)
; ale też nie jest Unary
operacja. Ponadto w sekcji zatytułowanej „Operatory jednoargumentowe
", wprowadzono trzy operatory, z których tylko jeden to + (Positive)
operator. Jednak w przypadku tego jedynego, który wydaje się być istotny, szybko staje się jasne, że ten operator również nie ma nic wspólnego z nienumerycznymi wartościami ciągu jako wyjaśnieniem + (Positive)
operator wyraźnie stwierdza, że ten operator ma zastosowanie tylko do wartości liczbowych:"Zwraca wartość wyrażenia liczbowego (operator jednoargumentowy)
".
Być może ten operator jest po to, aby z powodzeniem akceptować te wartości łańcuchowe, które zostały pomyślnie ocenione jako liczby, takie jak ta, która została tutaj użyta:
SELECT +'12345'+1
Kiedy powyższa instrukcja jest wykonywana, generuje na wyjściu liczbę, która jest sumą zarówno podanego łańcucha ocenionego jako liczba, jak i dodanej do niego wartości liczbowej, czyli 1
tutaj, ale oczywiście może to być dowolna inna kwota:
(No column name)
----------------
12346
(1 row(s) affected)
Wątpię jednak, aby to wyjaśnienie było poprawne, ponieważ rodzi następujące pytania:
Po pierwsze, jeśli przyjmiemy, że to wyjaśnienie jest prawdziwe, możemy stwierdzić, że wyrażenia takie jak +'12345'
są oceniane na liczby. Jeśli tak, to dlaczego te liczby mogą pojawiać się w funkcjach związanych z ciągiem znaków, takich jak DATALENGTH
, LEN
itp. Możesz zobaczyć takie stwierdzenie:
SELECT DATALENGTH(+'12345')
jest całkiem poprawny i daje następujące wyniki:
(No column name)
----------------
5
(1 row(s) affected)
co oznacza +'12345'
jest oceniany jako ciąg, a nie liczba. Jak można to wyjaśnić?
Po drugie, podczas gdy podobne instrukcje z -
operator, taki jak ten:
`SELECT -'ABCDE'`
a nawet to:
`SELECT -'12345'`
wygeneruj poniższy błąd:
Invalid operator for data type. Operator equals minus, type equals varchar.
Dlaczego, nie powinno generować błędu w podobnych przypadkach, gdy +
operator został błędnie użyty z nienumeryczną wartością ciągu?
Tak więc te dwa pytania uniemożliwiają mi zaakceptowanie wyjaśnienia, że to jest to samo + (unary)
operatora, który został wprowadzony w dokumentacji dla wartości liczbowych. Ponieważ nie ma innej wzmianki o tym nigdzie indziej, może się zdarzyć, że jest celowo dodany do języka. Może być błędem.
Problem wydaje się być poważniejszy, gdy widzimy, że nie jest generowany żaden błąd w przypadku takich instrukcji:
SELECT ++++++++'ABCDE'
Nie wiem, czy istnieją inne języki programowania, które akceptują tego rodzaju stwierdzenia. Ale jeśli tak, dobrze byłoby wiedzieć, w jakim celu (celach) używają + (unary)
operator zastosowany do ciągu. Nie wyobrażam sobie żadnego zastosowania!
AKTUALIZUJ
Tutaj jest napisane, że był to błąd we wcześniejszych wersjach, ale nie zostanie naprawiony z powodu wstecznej kompatybilności: