use Automart
--stored procedures
--this is a simple stored procedure
--that is basically a parameterized view
go
Create proc usp_GetRegisteredCustomer
@CustomerID int
As
Select LastName
,FirstName
,Email
,LicenseNumber
,VehicleMake
,VehicleYear
From Person p
inner Join Customer.Vehicle v
on p.Personkey=v.PersonKey
inner join Customer.RegisteredCustomer rc
on p.Personkey=rc.PersonKey
Where p.Personkey=@CustomerId
Go
--the exec keyword is optional but a good idea
--this executes the stored procedure
exec usp_GetRegisteredCustomer @CustomerID=3
Go
--this is more elaborate stored procedure
--alter the procedure if you make changes
--the procedure checks to see if the customer
--already exists. if the customer does exist
--the procedure aborts (the return)
--otherwise it inserts the new customer
--the three insert statments are contained in
--a transaction and a try catch
--if there is no error in any of the inserts
--the transaction commits and the inserts
--are written; if there is an error, the program
--falls to the catch and the inserts are rolled
--back. this prevents fragments from being
--inserted. Either all inserts go through or
--none of them
create proc usp_AddNewCustomer
@LastName nvarchar(255),
@FirstName nvarchar(255),
@LicenseNumber nvarchar(10),
@VehicleMake Nvarchar(255),
@VehicleYear nchar(4),
@Email nvarchar(255),
@Password nvarchar(20)
As
if exists
(Select lastName, FirstName, email
From Person p
inner join customer.RegisteredCustomer rc
on p.Personkey=rc.PersonKey
where lastname=@LastName
And firstname=@firstName
And email =@Email)
Begin
Print 'The customer already exists'
Return
End
Begin tran
Begin try
Insert into Person(LastName, firstName)
Values(@LastName, @FirstName)
Declare @PersonKey int
Set @PersonKey=IDENT_CURRENT('Person')
Insert into Customer.Vehicle(LicenseNumber, VehicleMake, VehicleYear, personKey)
Values(@LicenseNumber, @VehicleMake, @VehicleYear, @PersonKey)
insert into Customer.RegisteredCustomer(Email, CustomerPassword, PersonKey)
Values (@Email, @Password, @PersonKey)
Commit tran
end try
Begin Catch
Rollback tran
End catch
--this inserts a new customer the first time
--if you try to run it again with the same
--values it will say the customer exists
--and abort
exec usp_AddNewCustomer
@LastName ='Nelson',
@FirstName ='Lonny',
@LicenseNumber ='375 XCD',
@VehicleMake ='Cadillac',
@VehicleYear='2014',
@Email ='ln@gmail.com',
@Password ='password'
--just checking
Select * From Person
Select * From Customer.Vehicle where Personkey=60
Select * From customer.RegisteredCustomer where PersonKey=60
--a stored procecure to update the license number
--of a vehicle
--if the vehicle exists it will update it
--if not it will insert a new vehicle
Go
Alter proc usp_UpdateVehicle
@LicenseNumberOld nvarchar(10),
@LicenseNumber nvarchar(10),
@VehicleMake nvarchar(255),
@VehicleYear nchar(4),
@PersonKey int
As
if exists
(Select LicenseNumber from Customer.Vehicle
Where LicenseNumber = @LicenseNumberOld
And personkey =@PersonKey)
Begin
Update Customer.Vehicle
Set LicenseNumber=@LicenseNumber
Where PersonKey=@PersonKey
and VehicleMake=@VehicleMake
and VehicleYear = @VehicleYear
End
Else
Begin
Insert into Customer.Vehicle(LicenseNumber, VehicleMake, VehicleYear, PersonKey)
Values(@LicenseNumber, @VehicleMake,@VehicleYear, @PersonKey)
End
Select * From Customer.Vehicle
Go
--update a vehicle
exec usp_UpdateVehicle
@LicenseNumberOld ='New 123',
@LicenseNumber ='DOC 123',
@VehicleMake ='Toyota Camry',
@VehicleYear ='2004',
@PersonKey =1
--get an existing value out of a column
Declare @key int
Declare @Email nvarchar(255)
set @Email='candyman@gmail.com'
--you can use a select to get an existing value from a table
--and assign it to a variable
Select @Key = personkey from Customer.RegisteredCustomer
where Email=@Email
Select @Key
Select * from customer.RegisteredCustomer
Monday, February 23, 2015
Stored Procedures
Thursday, February 12, 2015
Community Assist Registration Service
Here is the github location for the code we did in class today https://github.com/spconger/CommuntyAssistRegistrationService
Wednesday, February 11, 2015
Creating Functions
--creating functions
--Aggregate, Scalar, TableValued
Use Automart
-- here is a really simple function that takes
--an integer as an argument and returns
--the cube of the integer
go
Create function CubeIt
(@number int) --parameters to pass in
returns int --set return type
As--always start with an as
Begin--begin function block
Declare @cubed int
set @cubed=@number*@number*@number
return @cubed
End--end Function block
Go
Select dbo.cubeiT(4) as cubed
--this function determins if an employe has
--worked more than 5 years
--it takes employeeId and hiredate
--as parameters
Go
Alter function ServiceRecognition
(@employeeID int, @hireDate date)
returns Nvarchar(50)--parameters
As--start function
Begin--begin function block
--declare a variable--all variables must start with @
Declare @currentDate date
--set the value of the variable
Set @currentDate=GETDATE()
Declare @years int
Set @years = DateDiff(yy,@HireDate, @CurrentDate)
Declare @message Nvarchar(50)
if @years > 5 --if statement to check years
Begin--begin if block
set @message= cast(@EmployeeID as Nvarchar(2)) + ', has been here '
+ cast(@years as nvarchar(4)) + ' Give them a raise '
End --end if block
else
Begin --begin else block
set @message= cast(@EmployeeID as Nvarchar(2))+ ' has been here ' + cast(@years as nvarchar(4))
End--end else block
return @message --return result
End
go
--use the function in a query
--you must specify the function owner, dbo in this case
Select EmployeeID, LastName, FirstName, Hiredate,
dbo.ServiceRecognition(employeeID, HireDate) as Years
From Person p
inner join Employee e
on p.PersonKey=e.Personkey
Where employeeID=4
--Determine the amount due for a service
--the price is in AutoService
--Other pricing Employee.ServiceDetail
Go
Create function fx_AmountDue
(@ServiceKey int,
@discount decimal(3,2),
@Tax decimal(4,3)=.095)--parameters
returns money --return type
As
Begin
Declare @Price money
Select @Price=serviceprice from Customer.AutoService
Where autoServiceID=@serviceKey
Declare @Total money
if @discount is null
Begin
set @Total=@price + (@price*@Tax)
End
Else
Begin
set @total = (@price - (@Price * @discount))+@price*@tax
end
return @Total
End
--use the function in a query
Select ServiceDate, ServiceName, VehicleID, ServicePrice, TaxPercent, DiscountPercent,
dbo.fx_AmountDue(sd.autoserviceID, discountPercent, TaxPercent) as subTotal
From Customer.AutoService s
inner Join Employee.VehicleServiceDetail sd
on s.AutoServiceID=sd.AutoServiceID
inner join Employee.VehicleService vs
on vs.VehicleServiceID=sd.VehicleServiceID
Where sd.VehicleServiceID =3
--use the function with an aggregate
Select Sum(dbo.fx_AmountDue(sd.autoserviceID, discountPercent, TaxPercent)) as Total
From Customer.AutoService s
inner Join Employee.VehicleServiceDetail sd
on s.AutoServiceID=sd.AutoServiceID
inner join Employee.VehicleService vs
on vs.VehicleServiceID=sd.VehicleServiceID
Where sd.VehicleServiceID =3
Tuesday, February 10, 2015
Community Service Services and Client Examples
Here is the path to the code for Tuesday 2/10/2015 code on github https://github.com/spconger/CAServiceExample
Here is the code to the code for the client https://github.com/spconger/CommunityAssistClient2015
Monday, February 9, 2015
Inheritance Examples
Here is the link to the code on GitHub https://github.com/spconger/InheritanceExampleJava
Here is a second link to our Wednesday Night example https://github.com/spconger/SecondInheritanceExample115
Indexes and Views
--indexes and joins --clustered indexes, non clustered indexes, unique, filtered Use Automart --the syntax is CREATE [type of Index] [Index Name] ON [Table](Column Name] --nonclustered is the default. You never have to actually write it --a nonclustered index creates a B-tree that breakes the data into --nodes. The search can locate the relevant node in 2 or three steps --rather than run through thousands of individual rows Create nonclustered Index ix_LastName on Person(lastName) --unique indexes ensure that a column is unique. It speeds up searches --because the server doesn't have to look for duplicated Create unique index ix_ServiceName on Customer.AutoService(ServiceName) --a filtered index has a where clause that can "filter" which rows --in a table are indexed Create nonclustered index Ix_olderData on Employee.VehicleService (ServiceDate) Where serviceDate > '1/1/2015' --it is possible to include more than one column in an index Create nonclustered index ix_employeeLoc on Employee(PersonKey, LocationID) --primary keys are indexed by default --but here is the syntax fro how to create one Create clustered index ix_PersonKey on Person(PersonKey) --forcing an index. SQL Server will not even create the index structure --the b-tree for tables under a certain number of rows (27000 or so) --the following syntax forces the use of the ix_Lastname index Select Lastname, firstName, email From Person p with (index(ix_lastName)) --this forces the index inner join Customer.RegisteredCustomer rc on rc.PersonKey=p.Personkey where LastName='Smith' --Go is used to separate batches. It means basically --finish everything before starting the next command Go --Views--the basic syntax is CREATE VIEW [Name] AS then --SQL Statement. Views are basically stored queries --they are filters. They don't store the actual data. --The idea of a view is to create a "View" of the database --for a particular set of users. Human Resources, for instance. --Some views can be used for updates and inserts but not --most. To allow updating and inserting the view must --be transparent. No aliases, not more than one join, --no calcualted fields. It is probably better to use stored --procedures rather than views for those tasks Create View vw_RegisteredCustomers AS Select LastName [Last Name] ,FirstName [First Name] , Email ,LicenseNumber License ,VehicleMake Make ,VehicleYear [Year] From Person p inner join Customer.RegisteredCustomer rc on p.Personkey=rc.PersonKey inner Join Customer.Vehicle v on v.PersonKey=p.Personkey Go --the order by clause is forbidden in creating views --but you can order the results of a query using --a view. Also when Selecting from a view --you must use the aliases as the column names Select * From vw_RegisteredCustomers Where [Last name] = 'Smith' order by [First Name]
Wednesday, February 4, 2015
Sub query example and Create and Alter Tables
Here is the subquery example
--get total number of grants, count denied, count reduced, percents Select count(GrantKey) [Total Grants], (Select count(GrantKey) From ServiceGrant where GrantApprovalStatus='denied') [Total Denied], (Select count(GrantKey) From ServiceGrant where GrantApprovalStatus='reduced')[Total Reduced], cast( Cast((Select count(GrantKey) From ServiceGrant where GrantApprovalStatus='denied')as decimal(5,2)) /cast (count(GrantKey)as Decimal(5,2)) * 100 as Decimal(5,2)) as [Percent Denied], cast( Cast((Select count(GrantKey) From ServiceGrant where GrantApprovalStatus='reduced')as decimal(5,2)) /cast (count(GrantKey)as Decimal(5,2)) * 100 as Decimal(5,2)) as [Percent Reduced] From ServiceGrant
Here are the Table and alter table examples with comments
Use Master --create a new database according to the model template Create Database BookReview --make sure you change the context to the new --database Use BookReview --create a table Create table Book ( --identity creates an autonumber, in this case --starting at 1 and incrementing by 1s --the primary key is declared inline which --means SQL Server names it BookKey int identity(1,1) primary Key, BookTitle NVarchar(255) not null, BookISBN NChar(13) null, BookPublishYear Int ) Create Table Author ( AuthorKey int Identity(1,1) not null, --declaring the key in a constraint --allows you to name it Constraint PK_Author Primary Key(AuthorKey), AuthorName Nvarchar(255) not null, AuthorDates Nvarchar(255) ) Create Table AuthorBook ( BookKey int not null, AuthorKey int not null, --a composite primary key Constraint PK_AuthorBook Primary Key(bookKey, AuthorKey), --two foreign keys --the foriegn key takes a field in this table and relates it --"references" the field in another table Constraint FK_Book Foreign Key(BookKey) references Book(BookKey), Constraint FK_Author Foreign Key(AuthorKey) references Author(AuthorKey) ) Create Table Review ( ReviewKey int identity(1,1) not null, BookKey int not null, --a default constraint ReviewDate Date default GetDate(), ReviewerKey int not null, ReviewRating int not null, --a check constraint lets you set a set or range of --acceptable values for a field Constraint chk_Rating Check (ReviewRating between 0 and 5), --NVarchar(max) lets you store up to 2 gigs of text, but --the text is not stored in the table itself, only a pointer to --the text is stored in the table. You can retrieve the contents, --but you cannot query the contents of the field or use it in a --where clause ReviewText Nvarchar(max) not null ) Create table Reviewer ( ReviewerKey int identity(1,1) not null, Reviewername nvarchar(255) not null, --the unique constraint forces the email --to be unique, to never repeat ReviewerEmail nvarchar(255) not null unique ) --to change an existing table you either need to drop and --recreate it or alter it --adds a primary key after the table has been made Alter table Review Add constraint PK_Review Primary Key(ReviewKey) --add a foreign key Alter Table Review Add Constraint fk_BookRev Foreign Key(bookKey) References Book(BookKey) Alter table Reviewer Add constraint PK_Reviewer Primary Key(ReviewerKey) Alter Table Review Add Constraint fk_Reviewer Foreign Key(ReviewerKey) References Reviewer(ReviewerKey) --add a column Alter table Reviewer Add ReviewerPhone nvarchar(13) not null --Drop a column Alter Table Reviewer Drop Column ReviwerPhone --drop the table itself Drop Table Review
Tuesday, February 3, 2015
A fix for Assignment 3
There is a permissions error in the Fan log in. To fix it Go to TOOLS in the Visual Studio menu, choose SQL, NEW QUERY. Connect the database to .\sqlexpress. Type in the following SQL.
Use ShowTracker Grant Select on FanLogin to FanRole
Once you run this code you should have the permissions you need
There are a couple of other common problems.
In the Login class there is a line (47) that assigns the userkey to key
key = u.ReviewerKey;
For some reason with the showtracker database we have to cast this to an int
key = (int)u.ReviewerKey;
Finally, be aware the random seed that is concatenated with the password is "LoginRandom" in the fanlogin table, not "FanKey" or "FanLoginKey."