Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

SQL Server:+(jednoargumentowy) operator na ciągach nienumerycznych

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:

Po pewnym dochodzeniu to zachowanie jest zgodne z projektem ponieważ + jest operatorem jednoargumentowym. Tak więc parser akceptuje „+ , a „+” jest po prostu ignorowane w tym przypadku. Zmiana tego zachowania ma wiele konsekwencji w zakresie kompatybilności wstecznej, więc nie zamierzamy tego zmieniać, a poprawka wprowadzi niepotrzebne zmiany w kodzie aplikacji.




  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łąd programu SQL Server 7222:„Tylko dostawca programu SQL Server jest dozwolony w tym wystąpieniu”

  2. Jak dodać numery linii w SQL Server Management Studio (SSMS) — samouczek SQL Server / TSQL, część 11

  3. UCS-2 i serwer SQL

  4. Zapytanie SQL z NOT LIKE IN

  5. Serwer SQL . Alias ​​nie działa