sql >> Database teknologi >  >> RDS >> Sqlserver

SQL Server:+(unær) operator på ikke-numeriske strenge

Her er mit eget svar på dette spørgsmål (se også opdateringen til sidst):

Nej, der er ikke en sådan unær operator defineret på String-udtrykkene. Det er muligt, at dette er en fejl.

Forklaring:

Den givne erklæring er gyldig, og den genererer følgende resultat:

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

hvilket svarer til at udføre SELECT sætning uden at bruge + tegn:

SELECT  'ABCDEF'

At blive kompileret uden at give nogen fejl, faktisk udføres med succes, giver indtryk af, at + fungerer som en Unary operation på den givne streng. Men i den officielle T-SQL dokumentation, er der ingen omtale af en sådan operatør. Faktisk i afsnittet med titlen "String Operators ", + vises i to strengoperationer, som er + (String Concatenation) og += (String Concatenation); men heller ikke en Unary operation. Også i afsnittet med titlen "Unary Operators ", er tre operatorer blevet introduceret, kun én af dem er + (Positive) operatør. Men for denne eneste, der synes at være relevant, bliver det hurtigt klart, at denne operator heller ikke har noget at gøre med ikke-numeriske strengværdier som forklaring på + (Positive) operator angiver udtrykkeligt, at denne operator kun gælder for numeriske værdier:"Returnerer værdien af et numerisk udtryk (en unær operator) ".

Måske er denne operator der for at acceptere de strengværdier, der med succes evalueres som tal, såsom den, der er blevet brugt her:

SELECT  +'12345'+1

Når ovenstående sætning udføres, genererer den et tal i outputtet, som er summen af ​​både den givne streng evalueret som et tal og den numeriske værdi tilføjet til den, som er 1 her, men det kunne åbenbart være et hvilket som helst andet beløb:

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

Jeg tvivler dog på, at denne forklaring er korrekt, da den rejser nedenstående spørgsmål:

For det første, hvis vi accepterer, at denne forklaring er sand, kan vi konkludere, at udtryk såsom +'12345' vurderes til tal. Hvis ja, hvorfor er det så, at disse tal kan optræde i strengrelaterede funktioner såsom DATALENGTH , LEN osv. Du kunne se en erklæring som denne:

  SELECT  DATALENGTH(+'12345')

er ganske gyldig, og det resulterer i nedenstående:

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

hvilket betyder +'12345' bliver evalueret som en streng og ikke et tal. Hvordan kan dette forklares?

For det andet, mens lignende udsagn med - operatør, såsom denne:

 `SELECT  -'ABCDE'` 

eller endda dette:

`SELECT  -'12345'` 

generere nedenstående fejl:

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

Hvorfor, burde det ikke generere en fejl for lignende tilfælde, når + operator er blevet brugt forkert med en ikke-numerisk strengværdi?

Så disse to spørgsmål forhindrer mig i at acceptere forklaringen om, at dette er den samme + (unary) operator, der er indført i dokumentationen for numeriske værdier. Da der ikke er nogen anden omtale af det andre steder, kan det være, at det er bevidst tilføjet til sproget. Kan være en fejl.

Problemet ser ud til at være mere alvorligt, når vi heller ikke ser, at der genereres nogen fejl for udsagn som denne:

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

Jeg ved ikke, om der er andre programmeringssprog derude, som accepterer den slags udsagn. Men hvis der er, ville det være rart at vide, til hvilket formål de bruger en + (unary) operator anvendt på en streng. Jeg kan ikke forestille mig nogen brug!

OPDATERING

Her står der, at dette har været en fejl i tidligere versioner, men det vil ikke blive rettet på grund af bagudkompatibilitet:

Efter nogle undersøgelser er denne adfærd ved design da + er en unær operator. Så parseren accepterer "+, og "+" ignoreres simpelthen i dette tilfælde. Ændring af denne adfærd har mange bagudkompatibilitetsimplikationer, så vi har ikke til hensigt at ændre det, og rettelsen vil introducere unødvendige ændringer for applikationskoden.




  1. Installation af psycopg2 mislykkes på MacOS med uklar fejlmeddelelse

  2. Følgende kode returnerer en 500 fejl, da koden er afskrevet i php version 7. Hvordan får man det til at fungere i php version 7?

  3. Udfør regex (erstat) i en SQL-forespørgsel

  4. Oracle, tilføjelse af indledende nuller til streng (ikke tal)