Använda skalärfunktioner
Skalärfunktioner returnerar ett enda värde och fungerar vanligtvis på en enda rad med data. Antalet indatavärden som de tar kan vara noll (till exempel GETDATE), ett (till exempel UPPER) eller flera (till exempel ROUND). Eftersom skalärfunktioner alltid returnerar ett enda värde kan de användas var som helst där ett enda värde (resultatet) behövs. De används oftast i SELECT-satser och WHERE-satspredikat. De kan också användas i SET-satsen i en UPDATE-instruktion.
Inbyggda skalärfunktioner kan ordnas i många kategorier, till exempel sträng, konvertering, logiska, matematiska och andra. I den här modulen tittar vi på några vanliga skalärfunktioner.
Några saker att tänka på när du använder skalärfunktioner är:
- Determinism: Om funktionen returnerar samma värde för samma indata- och databastillstånd varje gång den anropas, säger vi att den är deterministisk. Till exempel returnerar ROUND(1.1, 0) alltid värdet 1,0. Många inbyggda funktioner är icke-terministiska. GETDATE() returnerar till exempel aktuellt datum och tid. Resultat från icke-förutbestämda funktioner kan inte indexeras, vilket påverkar frågeprocessorns möjlighet att komma med en bra plan för att köra frågan.
 - Sortering: Vilken sortering används när du använder funktioner som manipulerar teckendata? Vissa funktioner använder sortering (sorteringsordning) för indatavärdet. andra använder sortering av databasen om ingen indatasortering har angetts.
 
Exempel på skalär funktion
I skrivande stund listade den tekniska dokumentationen för SQL Server mer än 200 skalärfunktioner som omfattar flera kategorier, inklusive:
- Konfigurationsfunktioner
 - Konverteringsfunktioner
 - Markörfunktioner
 - Funktionerna Date och Time
 - Matematiska funktioner
 - Metadatafunktioner
 - Säkerhetsfunktioner
 - Strängfunktioner
 - Systemfunktioner
 - Systemstatistikfunktioner
 - Text- och bildfunktioner
 
Det finns inte tillräckligt med tid i den här kursen för att beskriva varje funktion, men exemplen nedan visar några vanliga funktioner.
I följande hypotetiska exempel används flera datum- och tidsfunktioner:
SELECT  SalesOrderID,
    OrderDate,
        YEAR(OrderDate) AS OrderYear,
        DATENAME(mm, OrderDate) AS OrderMonth,
        DAY(OrderDate) AS OrderDay,
        DATENAME(dw, OrderDate) AS OrderWeekDay,
        DATEDIFF(yy,OrderDate, GETDATE()) AS YearsSinceOrder
FROM Sales.SalesOrderHeader;
Partiella resultat visas nedan:
FörsäljningsorderID
Beställningsdatum
Orderår
Beställningsmånad
Beställningsdag
Veckodag för beställning
År sedan beställning
71774
2008-06-01T00:00:00
2008
Juni
1
söndag
tretton
...
...
...
...
...
...
...
I nästa exempel finns några matematiska funktioner:
SELECT TaxAmt,
       ROUND(TaxAmt, 0) AS Rounded,
       FLOOR(TaxAmt) AS Floor,
       CEILING(TaxAmt) AS Ceiling,
       SQUARE(TaxAmt) AS Squared,
       SQRT(TaxAmt) AS Root,
       LOG(TaxAmt) AS Log,
       TaxAmt * RAND() AS Randomized
FROM Sales.SalesOrderHeader;
Partiella resultat:
TaxAmt
Rundad
Våning
Tak
Fyrkant
Rot
Loggas
Randomiserad
70.4279
70.0000
70.0000
71.0000
4960.089098
8.392133221
4.254589491
28.64120429
...
..
...
...
...
...
...
...
I följande exempel används vissa strängfunktioner:
SELECT  CompanyName,
        UPPER(CompanyName) AS UpperCase,
        LOWER(CompanyName) AS LowerCase,
        LEN(CompanyName) AS Length,
        REVERSE(CompanyName) AS Reversed,
        CHARINDEX(' ', CompanyName) AS FirstSpace,
        LEFT(CompanyName, CHARINDEX(' ', CompanyName)) AS FirstWord,
        SUBSTRING(CompanyName, CHARINDEX(' ', CompanyName) + 1, LEN(CompanyName)) AS RestOfName
FROM Sales.Customer;
Partiella resultat:
Företagsnamn
Versal
Gemen
Längd
Omvänd
FirstSpace
FirstWord
RestOfName
En cykelbutik
EN CYKELBUTIK
en cykelbutik
12
erotS ekiB A
2
A
Cykelbutik
Progressiv sport
PROGRESSIVA SPORTER
progressiva sporter
18
stropS evissergorP
12
Progressiv
Sport
Avancerade cykelkomponenter
AVANCERADE CYKELKOMPONENTER
avancerade cykelkomponenter
24
Avancerade cykelkomponenter
9
Avancerad
Cykelkomponenter
...
...
...
...
...
...
...
...
Logiska funktioner
En annan funktionskategori gör det möjligt att avgöra vilka av flera värden som ska returneras. Logiska funktioner utvärderar ett indatauttryck och returnerar ett lämpligt värde baserat på resultatet.
IIF
Funktionen IIF utvärderar ett booleskt indatauttryck och returnerar ett angivet värde om uttrycket utvärderas till Sant och ett alternativt värde om uttrycket utvärderas till Falskt.
Tänk till exempel på följande fråga, som utvärderar en kunds adresstyp. Om värdet är "Main Office" returnerar uttrycket "Fakturering". För alla andra adresstypsvärden returnerar uttrycket "Utskick".
SELECT AddressType,
      IIF(AddressType = 'Main Office', 'Billing', 'Mailing') AS UseAddressFor
FROM Sales.CustomerAddress;
De partiella resultaten från den här frågan kan se ut så här:
Adresstyp
AnvändAdressFör
Huvudkontor
Fakturering
Frakt
Utskick
...
...
VÄLJA
Funktionen CHOOSE utvärderar ett heltalsuttryck och returnerar motsvarande värde från en lista baserat på dess (1-baserade) ordningsposition.
SELECT SalesOrderID, Status,
CHOOSE(Status, 'Ordered', 'Shipped', 'Delivered') AS OrderStatus
FROM Sales.SalesOrderHeader;
Resultatet från den här frågan kan se ut ungefär så här:
FörsäljningsorderID
Läge
OrderStatus
1234
3
Levererat
1235
2
Levererad
1236
2
Levererad
1237
1
Beställt
...
...
...