Brug skalarfunktioner

Fuldført

Skalarfunktioner returnerer en enkelt værdi og arbejder normalt på en enkelt række med data. Antallet af inputværdier, de tager, kan være nul (f.eks. GETDATE), én (f.eks. UPPER) eller flere (f.eks. ROUND). Da skalarfunktioner altid returnerer en enkelt værdi, kan de bruges overalt, hvor der kræves en enkelt værdi (resultatet). De bruges oftest i SELECT-delsætninger og WHERE-delsætnings prædikater. De kan også bruges i SET-delsætningen i en UPDATE-sætning.

Indbyggede skalarfunktioner kan organiseres i mange kategorier, f.eks streng, konvertering, logisk, matematisk m.m. I dette modul ser vi på nogle få almindelige skalarfunktioner.

Nogle overvejelser, når du bruger skalarfunktioner, omfatter:

  • Determinisme: Hvis funktionen returnerer den samme værdi for den samme input- og databasetilstand, hver gang den kaldes, siger vi, at den er deterministisk. ROUND(1.1, 0) returnerer f.eks. altid værdien 1.0. Mange indbyggede funktioner er nondeterministiske. GETDATE() returnerer f.eks. den aktuelle dato og det aktuelle klokkeslæt. Resultater fra nondeterministiske funktioner kan ikke indekseres, hvilket påvirker forespørgselsbehandlerens mulighed for at komme med en god plan for udførelse af forespørgslen.
  • Sortering: Hvilken sortering bruges, når der bruges funktioner, der manipulerer tegndata? Nogle funktioner bruger sorteringsrækkefølgen for inputværdien. andre bruger databasens sortering, hvis der ikke er angivet nogen inputsamling.

Eksempler på skalarfunktion

I skrivende stund anviste SQL Server Technical Documentation mere end 200 skalarfunktioner, der spænder over flere kategorier, herunder:

  • Konfigurationsfunktioner
  • Konverteringsfunktioner
  • Markørfunktioner
  • Funktionerne Dato og klokkeslæt
  • Matematiske funktioner
  • Metadatafunktioner
  • Sikkerhedsfunktioner
  • Strengfunktioner
  • Systemfunktioner
  • System statistiske funktioner
  • Funktionerne Tekst og Billede

Der er ikke tid nok i dette kursus til at beskrive hver funktion, men nedenstående eksempler viser nogle ofte anvendte funktioner.

I følgende hypotetiske eksempel bruges flere funktioner for dato og klokkeslæt:

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;

Der vises delvise resultater nedenfor:

SalesOrderID

Ordredato

Ordreår

OrderMonth

OrderDay

OrderWeekDay

YearsSinceOrder

71774

2008-06-01T00:00:00

2008

Juni

1

Søndag

13

...

...

...

...

...

...

...

Det næste eksempel indeholder nogle matematiske 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;

Delvise resultater:

TaxAmt

Afrundet

Etage

Loft

Firkant

Rod

Log

Randomiseret

70.4279

70.0000

70.0000

71.0000

4960.089098

8.392133221

4.254589491

28.64120429

...

..

...

...

...

...

...

...

I følgende eksempel bruges nogle strengfunktioner:

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;

Delvise resultater:

Firmanavn

Store

Små

Længde

Vendt

FirstSpace

FirstWord

RestOfName

En cykelbutik

EN CYKELBUTIK

en cykelbutik

12

erotS ekiB A

2

En

Cykelbutik

Progressiv sport

PROGRESSIVE SPORTSGRENE

progressive sportsgrene

18

stropS evissergorP

12

Progressiv

Sport

Avancerede cykelkomponenter

AVANCEREDE CYKELKOMPONENTER

avancerede cykelkomponenter

24

stnenopmoC ekiB decnavdA

9

Avanceret

Cykelkomponenter

...

...

...

...

...

...

...

...

Logiske funktioner

En anden kategori af funktioner gør det muligt at bestemme, hvilken af flere værdier der skal returneres. Logiske funktioner evaluerer et inputudtryk og returnerer en passende værdi baseret på resultatet.

IIF

Funktionen IIF evaluerer et boolesk inputudtryk og returnerer en angivet værdi, hvis udtrykket evalueres til Sand, og en alternativ værdi, hvis udtrykket evalueres til Falsk.

Overvej f.eks. følgende forespørgsel, som evaluerer adressetypen for en kunde. Hvis værdien er "Hovedkontor", returnerer udtrykket "Fakturering". For alle andre værdier af adressetypen returnerer udtrykket "Mailing".

SELECT AddressType,
      IIF(AddressType = 'Main Office', 'Billing', 'Mailing') AS UseAddressFor
FROM Sales.CustomerAddress;

De delvise resultater fra denne forespørgsel kan se sådan ud:

AddressType

UseAddressFor

Hovedkontor

Fakturering

Forsendelse

Mailing

...

...

VÆLGE

Funktionen CHOOSE evaluerer et heltalsudtryk og returnerer den tilsvarende værdi fra en liste baseret på dens (1-baserede) ordenstalsplacering.

SELECT SalesOrderID, Status,
CHOOSE(Status, 'Ordered', 'Shipped', 'Delivered') AS OrderStatus
FROM Sales.SalesOrderHeader;

Resultaterne fra denne forespørgsel kan se nogenlunde sådan ud:

SalesOrderID

Status

OrderStatus

1234

3

Leveret

1235

2

Leveret

1236

2

Leveret

1237

1

Bestilt

...

...

...