| Create procedure nimi ….. | Create function nimi return …… |
| Teeb mitu tegevust korraga | Tagastab väärtused |
| EXEC nimi; EXECUTE nimi; | SELECT veerunimi, funktsiooni nimi FROM tabelinimi |
| INPUT, OUTPUT | INPUT |
| Protseduur = teeb tegevusi | Funktsioon = arvutab ja tagastab midagi |
Funktsioon mis arvutab vanus tekstina
create function fnComputeAge(@DOB datetime)
returns nvarchar(50)
as begin
declare @tempdate datetime, @years int, @months int, @days int
select @tempdate = @DOB
select @years = datediff(year, @tempdate, getdate()) - case when (month(@DOB) > month(GETDATE())) or (MONTH(@DOB)
= month (getdate()) and day(@DOB) > DAY(getdate())) then 1 else 0 end
select @tempdate = dateadd(year, @years, @tempdate)
select @months = datediff(month, @tempdate, getdate()) - case when day(@DOB) > day(getdate()) then 1 else 0 end
select @tempdate = dateadd(MONTH, @months, @tempdate)
select @days = datediff(day, @tempdate, getdate())
declare @Age nvarchar(50)
set @Age = cast(@years as nvarchar(4)) + ' Years ' + cast(@months as nvarchar(2)) +
' Months ' + cast(@days as nvarchar(2)) + ' Days old'
return @Age
end

Lisame DepartmentID ja Gender ALTER abil
alter table EmployeesWithDates
add DepartmentId int
alter table EmployeesWithDates
add Gender nvarchar(10)
Loome funktsioon fn_EmployeesByGender
-- scalare function annab mingis vahemikus olevaid andmeid,
-- inline table values ei kasuta begin ja end funktsioone
-- scalar annab väärtused ja inline annab tabeli
create function fn_EmployeesByGender(@Gender nvarchar(10))
returns table
as
return (select Id, Name, DateOfBirth, DepartmentId, Gender
from EmployeesWithDates
where Gender = @Gender)
Multi-State Funktsioonid
-- inline funktsioon
create function fn_GetEmployees()
returns table as
return (Select Id, Name, cast(DateOfBirth as date)
as DOB
from EmployeesWithDates)
select * from fn_GetEmployees()
--multi-state puhul peab defineerima uue tabeli veerud koos muutujatega
create function fn_MS_GetEmployees()
returns @Table Table (Id int, Name nvarchar(20), DOB date)
as begin
insert into @Table
select Id, Name, Cast(DateOfBirth as Date) from EmployeesWithDates
return
end
select * from fn_GetEmployees()
select * from fn_MS_GetEmployees()
-- mis vahe on inline funktsiooni ja multi-statement vahel???
--- inline tabeli funktsioonid on paremini töötamas kuna käsitletakse vaatena
--- multi puhul on pm tegemist stored proceduriga ja kulutab ressurssi rohkem
--muutke andmeid, Sam muutub Sam1
update fn_GetEmployees() set Name = 'Sam1' where Id = 1 --saab muuta andmeid
update fn_MS_GetEmployees() set Name = 'Sam' where Id = 1 --ei saa muuta multistate puhul