Tải bản đầy đủ (.docx) (34 trang)

ngày 13120 thông báo học bù tuần này các em sẽ học 2 buổi sáng thứ 5 16120 tiết 45 và chiều thứ 6 17120 tiết 67 tại phòng b204 các em đi học đầy đủ nhé c00gioithieumonhoc c01tongqua

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (112.97 KB, 34 trang )

<span class='text_page_counter'>(1)</span><div class='page_container' data-page=1>

I. VIEW


select * from kh
select * from hd
select * from SP
select * from cthd


--1)Tạo view vw_Products_Info hiển thị danh sách
các sản phẩm từ bảng Products và bảng Categories.
Thông tin bao gồm CategoryName, Description,


ProductName, QuantityPerUnit, UnitPrice, UnitsInStock
CREATE VIEW LOAISP_SP


AS


SELECT CATEGORYNAME, DESCRIPTION, PRODUCTNAME,
QUANTITYPERUNIT, UNITPRICE, UNITSINSTOCK


FROM Categories C JOIN PRODUCTS P
ON C.CATEGORYID =P.CATEGORYID
--XEM THÔNG TIN CUA VIEW


SELECT * FROM LOAISP_SP


--XEM THÔNG TIN TRO GIUP VE VIWE
SP_HELPTEXT LOAISP_SP


2) Tạo view List_Product_view chứa danh sách các
sản phẩm dạng hộp (box) có đơn giá > 16,



thơng tin gồm ProductID, ProductName, UnitPrice,
QuantityPerUnit, COUNT of OrderID


3) Tạo view vw_CustomerTotals hiển thị
tổng tiền bán được từ mỗi khách hàng theo
tháng và theo năm.


Thông tin gồm CustomerID, YEAR(OrderDate) AS OrderYear,
MONTH(OrderDate) AS OrderMonth,


SUM(UnitPrice*Quantity).
CREATE VIEW HD_KH
AS


SELECT CUSTOMERID, NAM =YEAR(ORDERDATE),


THANG=MONTH(ORDERDATE), TONGTIEN=SUM(UNITPRICE*QUANTITY)
FROM ORDERS O JOIN [ORDER DETAILS] OD


ON O.ORDERID = OD.ORDERID


GROUP BY CUSTOMERID, YEAR(ORDERDATE),
MONTH(ORDERDATE)


SP_HELPTEXT HD_KH
SELECT * FROM HD_KH
--XOAVIEW


</div>
<span class='text_page_counter'>(2)</span><div class='page_container' data-page=2>

--DE MA HOA CAU LENH


CREATE VIEW HD_KH


WITH ENCRYPTION --MA HOA CAU LENH
AS


SELECT CUSTOMERID, NAM =YEAR(ORDERDATE),


THANG=MONTH(ORDERDATE), TONGTIEN=SUM(UNITPRICE*QUANTITY)
FROM ORDERS O JOIN [ORDER DETAILS] OD


ON O.ORDERID = OD.ORDERID


GROUP BY CUSTOMERID, YEAR(ORDERDATE),
MONTH(ORDERDATE)


SP_HELPTEXT HD_KH


4) Tạo view trả về tổng số lượng sản phẩm
bán được của mỗi nhân viên (Employee)


theo từng năm.


Thông tin gồm EmployeeID, OrderYear, sumOfOrderQuantity
5) Tạo view ListCustomer_view chứa danh sách


các khách hàng có trên 5 hóa đơn đặt hàng từ
năm 1997 đến 1998, thông tin gồm mã khách
(CustomerID) , họ tên (CompanyName),
Số hóa đơn (CountOfOrders).



6) Tạo view ListProduct_view chứa danh sách những sản phẩm nhóm Beverages và
Seafood có tổng số lượng bán trong mỗi năm trên 30 sản phẩm, thông tin gồm


CategoryName, ProductName, Year, SumOfOrderQuantity.
7) Tạo view vw_OrderSummary với từ khóa


WITH ENCRYPTION gồm OrderYear (năm của ngày lập hóa đơn), OrderMonth (tháng
của ngày lập hóa đơn), OrderTotal (tổng tiền, =UnitPrice*Quantity). Sau đó xem thơng
tin và trợ giúp về mã lệnh của view này


8) Tạo view vwProducts với từ khóa
WITH SCHEMABINDING gồm


ProductID, ProductName, Discount.
Xem thơng tin của View.


Xóa cột Discount. Có xóa được khơng? Vì sao?
SELECT * FROM SP


CREATE VIEW SP_SHA
WITH SCHEMABINDING
AS


SELECT MASP, MAHD ,SOLUONG
FROM CTHD


9) Tạo view vw_Customer với từ khóa


</div>
<span class='text_page_counter'>(3)</span><div class='page_container' data-page=3>

ở thành phố London và Madrid, thông tin gồm:
CustomerID, CompanyName, City.



CREATE VIEW C9
AS


SELECT CustomerID, CompanyName, City
FROM CUSTOMERS


WHERE CITY ='LONDON'
WITH CHECK OPTION
SELECT * FROM C9
SP_HELPTEXT C9


SELECT * FROM CUSTOMERS


a. Chèn thêm một khách hàng mới không ở


thành phố London và Madrid thông qua view vừa tạo.
Có chèn được khơng? Giải thích.


INSERT C9(CUSTOMERID, COMPANYNAME, CITY)
VALUES (3333,'YYUUJK','LONDON')


SELECT * FROM C9


SELECT * FROM CUSTOMERS


b. Chèn thêm một khách hàng mới ở thành phố London và một khách hàng mới ở
thành phố Madrid. Dùng câu lệnh select trên bảng Customers để xem kết quả .



--DROP TABLE DONVI
DROP TABLE NHANVIEN
CREATE TABLE donvi


( madv INT PRIMARY KEY,


tendv NVARCHAR(30) NOT NULL,
dienthoai NVARCHAR(10) NULL
)


CREATE TABLE nhanvien


( manv NVARCHAR(10) PRIMARY KEY,
hoten NVARCHAR(30) NOT NULL,
ngaysinh DATETIME NULL,


diachi NVARCHAR(50) NULL,
madv INT FOREIGN KEY
REFERENCES donvi(madv)
ON DELETE CASCADE
ON UPDATE CASCADE
)


--Ví dụ: Xét định nghĩa hai bảng DONVI và NHANVIEN như sau:


</div>
<span class='text_page_counter'>(4)</span><div class='page_container' data-page=4>

Insert into DonVi (Madv, Tendv, DienThoai) values (2,'Tiep thi','822012')


Insert into nhanvien(manv,hoten,ngaysinh,diachi,madv) Values('NV01','Tran Van
A','3/2/1975','77 Tran Phu',1)



Insert into nhanvien(manv,hoten,ngaysinh,diachi,madv) Values('NV02','Mai Thi
Bich','13/2/1977','17 Nguyen Hue',2)


Insert into nhanvien(manv,hoten,ngaysinh,diachi,madv) Values('NV03','Le Van
Ha','3/2/1973','12 Tran Phu',2)


SELECT * FROM DONVI
SELECT * FROM NHANVIEN
CREATE VIEW nv11


AS


SELECT manv,hoten,madv FROM nhanvien
GO


SELECT * FROM NV11


INSERT INTO nv11 VALUES('NV04','Le Thi D',1)
SELECT * FROM NHANVIEN


CREATE VIEW nv21
AS


SELECT manv,hoten,YEAR(ngaysinh) AS namsinh,
madv FROM nhanvien


GO


SELECT * FROM NV21



INSERT INTO nv21(manv,hoten,madv)
VALUES('NV05','Le Van E',1)


SELECT * FROM NHANVIEN
INSERT INTO nv21


VALUES('NV06','Le Van F',1999,1)
Create Table KH_BAC


(Makh int, TenKh Nchar(30),
Khuvuc Nvarchar(30) NOT NULL
CHECK (Khuvuc='Bac bo'),


PRIMARY KEY (Makh, Khuvuc)
)


</div>
<span class='text_page_counter'>(5)</span><div class='page_container' data-page=5>

GO


Create Table KH_NAM


(Makh int, TenKh Nchar(30),


Khuvuc Nvarchar(30) NOT NULL CHECK (Khuvuc='Nam bo'),
PRIMARY KEY (Makh, Khuvuc)


)


Create View Khachhang
AS



Select * From KH_BAC
UNION ALL


Select * From KH_TRUNG
UNION ALL


Select * From KH_NAM
SELECT * FROM KH_BAC


SELECT * FROM KH_NAM
SELECT * FROM KH_TRUNG
SELECT * FROM KHACHHANG


INSERT Khachhang VALUES (1, 'CDCN4','Nam Bo')
INSERT Khachhang VALUES (1, 'CDCN4','BAC Bo')
SELECT * FROM KH_Nam


select * from dbo.[1v]
--VIEW


1) Tạo view vw_Products_Info hiển thị danh sách
các sản phẩm từ bảng Products và bảng Categories.


Thông tin bao gồm CategoryName, Description, ProductName,
QuantityPerUnit, UnitPrice, UnitsInStock


CREATE VIEW vw_Products_Info
AS


SELECT CategoryName, Description, ProductName,


QuantityPerUnit, UnitPrice, UnitsInStock


FROM dbo.Categories C JOIN PRODUCTS P
ON C.CATEGORYID =P.CATEGORYID
SELECT * FROM dbo.vw_Products_Info


2) Tạo view List_Product_view chứa danh sách các sản phẩm dạng hộp (box) có đơn
giá > 16, thông tin gồm ProductID, ProductName, UnitPrice, QuantityPerUnit, COUNT
of OrderID


3) Tạo view vw_CustomerTotals hiển thị tổng tiền
bán được từ mỗi khách hàng theo tháng và theo năm.


</div>
<span class='text_page_counter'>(6)</span><div class='page_container' data-page=6>

SUM(UnitPrice*Quantity).


CREATE VIEW vw_CustomerTotals
AS


SELECT CUSTOMERID, NAM =YEAR(ORDERDATE),
THANG =MONTH(ORDERDATE),


TONGTIEN =SUM(UNITPRICE*QUANTITY)
FROM ORDERS O JOIN dbo.[Order Details] OD
ON O.ORDERID =OD.ORDERID


GROUP BY CUSTOMERID, YEAR(ORDERDATE),
MONTH(ORDERDATE)


SELECT * FROM dbo.vw_CustomerTotals
--XOA VIEW



DROP VIEW vw_CustomerTotals
CREATE VIEW vw_CustomerTotals
AS


SELECT CUSTOMERID,


THANGNAM =CONVERT(CHAR(2),MONTH(ORDERDATE))+'/'+
CONVERT(CHAR(4),YEAR(ORDERDATE)),


TONGTIEN =SUM(UNITPRICE*QUANTITY)
FROM ORDERS O JOIN dbo.[Order Details] OD
ON O.ORDERID =OD.ORDERID


GROUP BY CUSTOMERID, CONVERT(CHAR(2),MONTH(ORDERDATE))
+'/'+


CONVERT(CHAR(4),YEAR(ORDERDATE))
SELECT * FROM vw_CustomerTotals


--XEM CODE CUA VIEW


SP_HELPTEXT vw_CustomerTotals


4) Tạo view trả về tổng số lượng sản phẩm bán được của mỗi nhân viên (Employee)
theo từng năm. Thông tin gồm EmployeeID, OrderYear, sumOfOrderQuantity


5) Tạo view ListCustomer_view chứa danh sách các khách hàng có trên 5 hóa đơn
đặt hàng từ năm 1997 đến 1998, thơng tin gồm mã khách (CustomerID) , họ tên



(CompanyName), Số hóa đơn (CountOfOrders).


6) Tạo view ListProduct_view chứa danh sách những sản phẩm nhóm Beverages và
Seafood có tổng số lượng bán trong mỗi năm trên 30 sản phẩm, thông tin gồm


CategoryName, ProductName, Year, SumOfOrderQuantity.
7) Tạo view vw_OrderSummary với từ khóa


WITH ENCRYPTION gồm OrderYear
(năm của ngày lập hóa đơn), OrderMonth
(tháng của ngày lập hóa đơn), OrderTotal
(tổng tiền, =UnitPrice*Quantity).


</div>
<span class='text_page_counter'>(7)</span><div class='page_container' data-page=7>

CREATE VIEW VW_ORDERSUMARY
WITH ENCRYPTION


AS


SELECT ORDERYEAR =YEAR(ORDERDATE),
ORDERMONTH=MONTH(ORDERDATE),
ORDERTOTAL =SUM(QUANTITY*UNITPRICE)
FROM ORDERS O JOIN [ORDER DETAILS] OD
ON O.ORDERID =OD.ORDERID


GROUP BY YEAR(ORDERDATE),
MONTH(ORDERDATE)


SELECT * FROM VW_ORDERSUMARY
SP_HELPTEXT VW_ORDERSUMARY



SELECT ORDERTOTAL =SUM(QUANTITY*UNITPRICE),
ORDERYEAR =YEAR(ORDERDATE),


ORDERMONTH=MONTH(ORDERDATE)
FROM ORDERS O JOIN [ORDER DETAILS] OD
ON O.ORDERID =OD.ORDERID


GROUP BY YEAR(ORDERDATE),
MONTH(ORDERDATE)


TU KHOA WITH SCHE
DROP VIEW VWPRODUCTS
CREATE VIEW vwProducts
WITH SCHEMABINDING
AS


SELECT CompanyName, ProductName, UnitPrice
FROM dbo.Suppliers INNER JOIN dbo.Products
ON Suppliers.SupplierID = Products.SupplierID
GO


ALTER TABLE dbo.Products
DROP COLUMN UnitPrice





8) Tạo view vwProducts với từ khóa


WITH SCHEMABINDING gồm


ProductID, ProductName, Discount.
Xem thơng tin của View.


Xóa cột Discount. Có xóa được khơng? Vì sao?
DROP VIEW vwProducts


</div>
<span class='text_page_counter'>(8)</span><div class='page_container' data-page=8>

WITH SCHEMABINDING
AS


SELECT P.ProductID, ProductName, Discount


FROM DBO.PRODUCTS P JOIN DBO.[ORDER DETAILS] OD
ON P.PRODUCTID =OD.PRODUCTID


SELECT * FROM vwProducts


ALTER TABLE DBO.[ORDER DETAILS]
DROP COLUMN DISCOUNT




--CREATE VIEW CustomerSLD AS


SELECT * FROM Customers WHERE city='LonDon'
Select * from CustomerSLD


SELECT * FROM CUSTOMERS WHERE CUSTOMERID ='3333'
GO



UPDATE CustomersLD SET city='Anh Quoc'
WHERE CustomerID='3333'


DROP VIEW CUSTOMERSLD
ALTER VIEW CustomerSLD AS


SELECT * FROM Customers WHERE city='LonDon'
--WITH CHECK OPTION


Select * from CustomerSLD


SELECT * FROM CUSTOMERS WHERE CUSTOMERID ='3333'
GO


UPDATE CustomersLD SET city='Anh Quoc'
WHERE CustomerID='SEVES'


SELECT * FROM CustomersLD


select * from Customers where CustomerID='AROUT'


9) Tạo view vw_Customer với từ khóa WITH CHECK OPTION chỉ chứa các khách
hàng ở thành phố London và Madrid, thông tin gồm: CustomerID, CompanyName, City.
a. Chèn thêm một khách hàng mới không ở thành phố London và Madrid thông qua view
vừa tạo. Có chèn được khơng? Giải thích.


b. Chèn thêm một khách hàng mới ở thành phố London và một khách hàng mới ở
thành phố Madrid. Dùng câu lệnh select trên bảng Customers để xem kết quả .
CREATE TABLE donvi1



( madv INT PRIMARY KEY,


</div>
<span class='text_page_counter'>(9)</span><div class='page_container' data-page=9>

)


CREATE TABLE nhanvien1


( manv NVARCHAR(10) PRIMARY KEY,
hoten NVARCHAR(30) NOT NULL,
ngaysinh DATETIME NULL,


diachi NVARCHAR(50) NULL,
madv INT FOREIGN KEY
REFERENCES donvi1(madv)
ON DELETE CASCADE
ON UPDATE CASCADE
)


Insert into DonVi1 (Madv, Tendv, DienThoai) values (1,'P.Kinh doanh','822321')
Insert into DonVi1 (Madv, Tendv, DienThoai) values (2,'Tiep thi','822012')


Insert into nhanvien1(manv,hoten,ngaysinh,diachi,madv) Values('NV01','Tran Van
A','3/2/1975','77 Tran Phu',1)


Insert into nhanvien1(manv,hoten,ngaysinh,diachi,madv) Values('NV02','Mai Thi
Bich','13/2/1977','17 Nguyen Hue',2)


Insert into nhanvien1(manv,hoten,ngaysinh,diachi,madv) Values('NV03','Le Van
Ha','3/2/1973','12 Tran Phu',2)



SELECT * FROM DONVI1
SELECT * FROM NHANVIEN1
CREATE VIEW nv1A


AS


SELECT manv,hoten,madv FROM nhanvien1
GO


INSERT INTO nv1A VALUES('NV04','Le Thi D',1)
SELECT * FROM NV1A


SELECT * FROM NHANVIEN1
CREATE VIEW nv2A


AS


SELECT manv,hoten,YEAR(ngaysinh) AS namsinh,madv FROM nhanvien
GO


INSERT INTO nv2(manv,hoten,madv) VALUES('NV05','Le Van E',1) –Lỗi
GO


UPDATE nv2 SET hoten='Le Thi X' WHERE manv='NV04' –Thực hiện được
GO


</div>
<span class='text_page_counter'>(10)</span><div class='page_container' data-page=10>

--Khong co tham so
CREATE PROC Tong
as



Declare @a float, @b float
Set @a =7


Set @b =3


Print convert(char(4),@a)+'+'


+convert(char(4),@b)+'='+convert(char(10),@a+@b)
Print convert(char(4),@a)+'-'


+convert(char(4),@b)+'='+convert(char(10),@a-@b)
Print convert(char(4),@a)+'*'


+convert(char(4),@b)+'='+convert(char(10),@a*@b)
If @b<>0


print convert(char(4),@a)+'/'


+convert(char(4),@b)+'='+convert(char(10),@a/@b)
Else


Print 'Khong chia duoc'
--Thuc thi


EXEC Tong


--xem tro giup thu tuc
sp_helptext tong
--sua thu tuc
alter PROC Tong


with encryption
as


Declare @a float, @b float
Set @a =7


Set @b =3


Print convert(char(4),@a)+'+'


+convert(char(4),@b)+'='+convert(char(10),@a+@b)
Print convert(char(4),@a)+'-'


+convert(char(4),@b)+'='+convert(char(10),@a-@b)
Print convert(char(4),@a)+'*'


+convert(char(4),@b)+'='+convert(char(10),@a*@b)
If @b<>0


print convert(char(4),@a)+'/'


+convert(char(4),@b)+'='+convert(char(10),@a/@b)
Else


Print 'Khong chia duoc'
--Thuc thi


EXEC Tong


</div>
<span class='text_page_counter'>(11)</span><div class='page_container' data-page=11>

--Viet thu tuc giai pt bac 1


ax+b=0


create proc ptb1
as


begin


declare @a float, @b float
set @a=5


set @b=7
if (@a=0)


if (@b=0)


print 'phuong trinh vo so nghiem'
else


print 'phuong trinh vo nghiem'
else


print 'phuong trinh co nghiem x='
+convert(char(4),-@b/@a)
end


--thuc thi
exec ptb1
----Co tham so


CREATE PROC Tong1


@a float, @b float
as


Print convert(char(4),@a)+'+'


+convert(char(4),@b)+'='+convert(char(10),@a+@b)
Print convert(char(4),@a)+'-'


+convert(char(4),@b)+'='+convert(char(10),@a-@b)
Print convert(char(4),@a)+'*'


+convert(char(4),@b)+'='+convert(char(10),@a*@b)
If @b<>0


print convert(char(4),@a)+'/'


+convert(char(4),@b)+'='+convert(char(10),@a/@b)
Else


Print 'Khong chia duoc'
--Thuc thi cach 1


EXEC Tong1 7,9
--thuc thi cach 2


declare @a float, @b float
set @a=45


set @b=78



</div>
<span class='text_page_counter'>(12)</span><div class='page_container' data-page=12>

--sua thu tuc
alter PROC Tong
with encryption
as


Declare @a float, @b float
Set @a =7


Set @b =3


Print convert(char(4),@a)+'+'


+convert(char(4),@b)+'='+convert(char(10),@a+@b)
Print convert(char(4),@a)+'-'


+convert(char(4),@b)+'='+convert(char(10),@a-@b)
Print convert(char(4),@a)+'*'


+convert(char(4),@b)+'='+convert(char(10),@a*@b)
If @b<>0


print convert(char(4),@a)+'/'


+convert(char(4),@b)+'='+convert(char(10),@a/@b)
Else


Print 'Khong chia duoc'
--Thuc thi


EXEC Tong



--xem tro giup thu tuc
sp_helptext tong


--Viet thu tuc giai pt bac 1
ax+b=0


create proc ptb1a
@a float,@b float
as


begin


if (@a=0)


if (@b=0)


print 'phuong trinh vo so nghiem'
else


print 'phuong trinh vo nghiem'
else


print 'phuong trinh co nghiem x='
+convert(char(4),-@b/@a)
end


--thuc thi
exec ptb1a 5,2
-- thuc thi c2



declare @a float, @b float
set @a=5


</div>
<span class='text_page_counter'>(13)</span><div class='page_container' data-page=13>

exec ptb1a @a,@b
--viet thu tục hiển thị


--danh sách khách hàng ở thành phô LonDon
alter proc dskhlondon


@tp nvarchar(15)
as


select * from Customers where city =@tp
exec dskhlondon 'ha noi'


--tham so dang output
CREATE PROC Tinhtoan


@a int, @b int , @tong int output, @hieu int output, @tich int output, @thuong
real output


as
Begin


Set @tong =@a +@b
Set @hieu = @a -@b
Set @tich = @a *@b
if @b<>0



begin


Set @thuong = @a/@b


Print 'Thuong ='+convert(varchar(10),@thuong)
end


else


Print 'Khong chia duoc'
Set @b = @b *100


End


alter PROC Tinhtoan


@a int, @b int , @tong int output
as


Begin


Set @tong =@a +@b
End


declare @a int,@b int, @tong int
set @a=9


set @b=7


</div>
<span class='text_page_counter'>(14)</span><div class='page_container' data-page=14>

--III. HÀM



Create function tong2so()
Returns int


as
Begin


Declare @so1 int, @so2 int
Set @so1 = 4


set @so2 =6


Return @so1+@so2
end


--thuc hien


print 'Tong = ' +convert(char(10),dbo.tong2so())
print 'Tong = ' +convert(char(10),dbo.tong2so())
select dbo.tong2so() as Tong


--Viết 1 hàm tinh tien dien, biet sokw tieu thu.
--Hàm trả về số tiền phải trả= sokw*dongia.


--Don gia được tính như sau: nếu skw<100, dg =1000,
--skw từ 100 đến 150 thì dongia =1200 cho số vượt,
--skw>150 thì dongia =1500 cho số vượt


alter function TienDien()
returns float



with encryption
as


begin


declare @sokw float, @tt float
set @sokw =140


if (@sokw<=150)


set @tt =@sokw*1000
else


if (@sokw<150)


set @tt=100*1000+(@sokw-100)*1200
else


set @tt=100*1000+50*1200+(@sokw-150)*1500
return @tt


end
--Thưc thi


print 'Tong tien phai tra ='+convert(char(10),dbo.Tiendien())
select dbo.TienDien() as Tientra





</div>
<span class='text_page_counter'>(15)</span><div class='page_container' data-page=15>

--Ví dụ 2 : Hàm trả về tổng tiền của khách hàng có mã là TOMSP
drop function Tongtien


Create function Tongtien()
Returns money


AS
Begin


Declare @tong money


Select @tong = sum(unitprice*Quantity) from orders o, [Order
Details] d


where o.orderid = d.orderid and customerid = 'TOMSP'
Return @tong


End


print 'Tong = ' +convert(char(10),dbo.tongtien())


select dbo.tongtien() as [Tong Tien Cua Khach Hang TOMPS]


--Bài tập áp dụng : Hàm trả về thứ bằng tiếng việt
drop function thu


Create function thu(@ngay datetime)
Returns varChar(10)



As


Begin Declare @t varchar(10), @d tinyint
Set @d = datepart(dw,@ngay)
Set @t = case


When @d = 1 then 'Chu Nhat'
When @d = 2 then 'Hai'
When @d = 3 then 'Ba'
When @d = 4 then 'Tu'
When @d = 5 then 'Nam'
When @d = 6 then 'Sau'
When @d = 7 then 'Bay'
end


Return @t
end


--thuc thi


set dateformat dmy
declare @ngay date
set @ngay ='16/1/1997'


print 'Hom nay la thu ='+dbo.thu(@ngay)
select employeeid, lastname,firstname,birthdate,
dbo.thu(birthdate)


</div>
<span class='text_page_counter'>(16)</span><div class='page_container' data-page=16>




----2) Viết hàm tên là InstockProd (dạng scalar function) với tham số vào là


@ProductID và @SupplierID. Hàm trả về số lượng tồn kho (UnitInStock) của sản phẩm
@ProductID do nhà cung cấp @SupplierID cung cấp.


--3) Viết hàm tên SalesOfEmp
(dạng scalar function)


trả về tổng doanh thu bán hàng
(SUM(UnitPrice*Quantity))


của một nhân viên trong một tháng tùy ý và
trong một năm tùy ý,


với tham số vào @EmployeeID, @MonthOrder,
@YearOrder


--tri tra ve :tổng doanh thu bán hàng
(SUM(UnitPrice*Quantity))


--tham so vao:manv,thang,nam


create function tongdt(@manv int, @thang int,@nam int)
returns money


as
begin


declare @tong money



select @tong =sum(unitprice *quantity)
from [order details] od join orders o
on o.orderid =od.orderid


where employeeid =@manv
and year(orderdate)=@nam
and month(orderdate)=@thang
return @tong


end
--thuc thi


declare @manv int, @nam int,@thang int
set @manv=3


set @nam=1996
set @thang=7


print 'tong tien='+convert(char(10),dbo.tongdt(@manv,@thang,@nam))
--ham tra ve bang du lieu




--select top 1 with ties orderid, tongtien =SUM(unitprice*quantity)
from dbo.[Order Details]


group by orderid
order by tongtien desc



</div>
<span class='text_page_counter'>(17)</span><div class='page_container' data-page=17>

group by orderid


having SUM(unitprice*quantity)
>=all( select SUM(unitprice*quantity)
from [Order Details] group by OrderID)
--Hàm


--Scalar Function:


1) Viết hàm tên CountOfProducts


(dạng scalar function) với tham số @MaNhom,
giá trị truyền vào lấy từ field CategoryID,


hàm trả về số sản phẩm tương ứng với mã nhóm hàng.
Áp dụng hàm đã viết vào câu truy vấn liệt kê danh


sách các nhóm hàng cùng với số sản phẩm thuộc mỗi nhóm,
thơng tin gồm: CategoryID, CategoryName, CountOfProduct.
tenham:CountOfProducts


tham so:mã loại CategoryID
tri tra ve: so sp tuong ung


ALTER FUNCTION CountOfProducts(@MALOAI INT)
RETURNS INT


AS
BEGIN



DECLARE @SOSP INT


SELECT @SOSP=COUNT (CATEGORYID)
FROM PRODUCTS


WHERE CATEGORYID=@MALOAI
GROUP BY CATEGORYID


RETURN @SOSP
END


--THUC THI


DECLARE @ML INT
SET @ML =2


PRINT 'LOAI SP SO '+CONVERT(CHAR(10),@ML) +'CO '
+CONVERT(CHAR(10),DBO.CountOfProducts(@ML))
-- Áp dụng hàm đã viết vào câu truy vấn liệt kê danh


sách các nhóm hàng cùng với số sản phẩm thuộc mỗi nhóm,
thơng tin gồm: CategoryID, CategoryName, CountOfProduct.
SELECT CategoryID, CategoryName,


CountOfProduct=DBO.CountOfProducts(CategoryID)
FROM dbo.Categories


2) Viết hàm tên là InstockProd (dạng scalar function)
với tham số vào là @ProductID và @SupplierID.



</div>
<span class='text_page_counter'>(18)</span><div class='page_container' data-page=18>

@SupplierID cung cấp.
TENHAM:InstockProd


THAMSO:@ProductID và @SupplierID
TRẢ VỀ:số lượng tồn kho (UnitInStock)
của sản phẩm @ProductID do nhà cung cấp
@SupplierID cung cấp.


CREATE FUNCTION InstockProd(@MASP INT,@MANCC INT)
RETURNS INT


AS
BEGIN


DECLARE @SLTON INT


SELECT @SLTON =UnitsInStock
FROM PRODUCTS


WHERE PRODUCTID =@MASP AND SUPPLIERID =@MANCC
RETURN @SLTON


END


--THUC THI


DECLARE @MASP INT, @MANCC INT
SET @MASP =1


SET @MANCC=1



SELECT DBO.InstockProd(@MASP,@MANCC)AS STTON


3) Viết hàm tên SalesOfEmp (dạng scalar function)
trả về tổng doanh thu bán hàng


(SUM(UnitPrice*Quantity)) của một nhân viên
trong một tháng tùy ý và trong một năm tùy ý,


với tham số vào @EmployeeID, @MonthOrder, @YearOrder


ALTER FUNCTION SALESOFEMP(@MANV INT, @THANG INT,@NAM INT)
RETURNS MONEY


AS
BEGIN


DECLARE @DT MONEY


SELECT @DT=SUM(QUANTITY*UNITPRICE)
FROM [ORDER DETAILS] OD JOIN ORDERS O ON
O.ORDERID=OD.ORDERID


WHERE EMPLOYEEID =@MANV AND
MONTH(ORDERDATE)=@THANG


AND YEAR(ORDERDATE)=@NAM
RETURN @DT


</div>
<span class='text_page_counter'>(19)</span><div class='page_container' data-page=19>

--DECLARE @MANV INT, @T INT, @N INT


SET @MANV=2


SET @T=6
SET @N=1997


SELECT DBO.SALESOFEMP(@MANV,@T,@N) AS DOANHTHU


--SELECT O.EMPLOYEEID, FULLNAME=LASTNAME+' '+FIRSTNAME,
DOANHTHU =DBO.SALESOFEMP(O.EMPLOYEEID,


MONTH(ORDERDATE),YEAR(ORDERDATE))
FROM EMPLOYEES E JOIN ORDERS O


ON E.EMPLOYEEID =O.EMPLOYEEID
--TABLE VALUES


4) Viết hàm SumofOrder với hai tham số @thang và
@nam, trả về danh sách các hóa đơn (OrderID)


lập trong tháng và năm được truyền vào từ
2 tham số @thang và @nam, có tổng tiền >5000,
thơng tin gồm OrderID, OrderDate, SubTotal,
trong đó SubTotal =sum(Quantity*UnitPrice).


5) Viết hàm tên SumOfProduct với tham số đầu vào là
@MaNCC (SupplierID),


hàm dùng để tính tổng số lượng (SumOfQuantity)


và chiết khấu cao nhất (MaxOfDiscount)


của các sản phẩm do nhà cung cấp @MaNCC cung cấp,
thông tin gồm ProductID, SumOfQuantity, MaxOfDiscount
CREATE FUNCTION SUMOFPRODUCT(@MANCC INT)
RETURNS TABLE


AS


RETURN SELECT OD.ProductID, SumOfQuantity =SUM(QUANTITY),
MaxOfDiscount =MAX(Discount)


FROM dbo.[Order Details] OD JOIN PRODUCTS P
ON OD.PRODUCTID =P.PRODUCTID


WHERE SupplierID= @MANCC
GROUP BY OD.ProductID
--THUC THI


DECLARE @MANCC INT
SET @MANCC =1


SELECT * FROM SUMOFPRODUCT(@MANCC)
6) Viết hàm tên Discount_Func tính số tiền giảm
trên các hóa đơn (OrderID),


</div>
<span class='text_page_counter'>(20)</span><div class='page_container' data-page=20>

Nếu Quantity< 10 thì Discount=0,


Nếu 10<= Quantity <30 thì Discount = 5% [UnitPrice*Quantity]
Nếu 30<= Quantity <50 thì Discount = 10%[UnitPrice*Quantity]


Nếu Quantity >=50 thì Discount = 15% [UnitPrice*Quantity]
CREATE FUNCTION DISCOUNT_FUNC()


RETURNS TABLE
AS


RETURN SELECT OrderID, Quantity, Discount=CASE
WHEN QUANTITY<10 THEN 0


WHEN QUANTITY BETWEEN 10 AND 50 THEN
0.05*(UNITPRICE*QUANTITY)


WHEN QUANTITY BETWEEN 50 AND 100 THEN
0.1*(UNITPRICE*QUANTITY)


ELSE 0.15*(UNITPRICE*QUANTITY)
END


FROM [ORDER DETAILS]
--THUC THI


SELECT * FROM DISCOUNT_FUNC()


-- HAM TRA VE TABLE DANG MULTITABLE
--Multi statement Table Valued Functions


--8) Viết lại các câu 5,6,7 bằng multi-statement table valued function
7) Viết hàm TotalOfEmp với tham số @MonthOrder,


@YearOrder để tính tổng doanh thu của các nhân viên


trong tháng và năm được truyền vào 2 tham số,


thông tin gồm EmployeeID, Total, với Total=Sum(UnitPrice*Quantity).
TEN HAM: TOTALOFEMP


THAMSO:@THANG, @NAM


TRA VE :EmployeeID, Total, với Total=Sum(UnitPrice*Quantity)
--CACH 1 INLINE


CREATE FUNCTION BAI7(@THANG INT,@NAM INT)
RETURNS TABLE


AS


RETURN SELECT EmployeeID, Total=Sum(UnitPrice*Quantity)


FROM dbo.[Order Details] OD JOIN ORDERS O ON OD.ORDERID =O.ORDERID
WHERE MONTH(ORDERDATE)=@THANG AND YEAR (ORDERDATE)=@NAM
GROUP BY EmployeeID


--THUC THI


DECLARE @T INT, @N INT
SET @T=7


SET @N=1996


</div>
<span class='text_page_counter'>(21)</span><div class='page_container' data-page=21>

CREATE FUNCTION BAI72(@T INT ,@N INT)



RETURNS @B TABLE(EMPLOYEEID INT, TOTAL MONEY)
AS


BEGIN


INSERT @B


SELECT EmployeeID, Total=Sum(UnitPrice*Quantity)


FROM dbo.[Order Details] OD JOIN ORDERS O ON OD.ORDERID =O.ORDERID
WHERE MONTH(ORDERDATE)=@T AND YEAR (ORDERDATE)=@N


GROUP BY EmployeeID
RETURN


END


--THUC THI


DECLARE @T INT, @N INT
SET @T=7


SET @N=1996


SELECT * FROM BAI72(@T,@N)


9) Viết hàm tên TonKho trả về kết quả là bảng tồn kho
của sản phẩm, với tham số vào là @MaSP, thông tin gồm
ProductID, ProductName, UnitsInStock. .



Nếu giá trị của tham số truyền vào là @MaSP khác Null
thì kết quả là bảng tồn kho của sản phẩm đó.


Nếu giá trị truyền vào là Null thì kết quả là bảng
tồn kho của tất cả sản phẩm


TEN HAM :TONKHO
THAM SO:@MASP


TRA VE: ProductID, ProductName, UnitsInStock
CREATE FUNCTION BAI9(@MASP INT)


RETURNS @TK TABLE(PRODUCTID INT, PRODUCTNAME NVARCHAR(40),
UNITSINSTOCK INT)


AS
BEGIN


IF (@MASP IS NOT NULL)
INSERT @TK


SELECT ProductID, ProductName, UnitsInStock
FROM PRODUCTS


WHERE PRODUCTID=@MASP
RETURN


END



--SELECT * FROM BAI9(NULL)
IV. TRIGGER


</div>
<span class='text_page_counter'>(22)</span><div class='page_container' data-page=22>

--drop table lop1
drop table sv1


create table lop1(malop int , tenlop nvarchar(30), siso int)
create table sv1 (masv int, tensv nvarchar(40), malop int)
insert lop1 values(1,'dhtmdt',0)


select * from lop1


--viet 1 trigger khi them vao 1 sv thuoc mot lop nao do thi siso tu dong tang len
create trigger vd1


on SV1
FOR INSERT
AS


BEGIN


UPDATE lop1


SET SISO =SISO+ 1--COUNT(*) FROM inserted
WHERE malop IN (SELECT malop FROM inserted)
END


INSERT sv1 VALUES(1,'LAN',1)
INSERT sv1 VALUES(2,'MINH',1)
SELECT * FROM SV1



SELECT * FROM LOP1
--Ôn Triggers


CREATE TABLE HD


(MAHD INT, MAKH NCHAR(10),NGAYLAP DATE,NGAYGIAO DATE)
--TAO 1 TRIGGER KHI THEM 1 DONG DU LIEU VAO BANG HD1 NEU
NGAY LAP >NGAY GIAO THI HIEN TB LOI VA KHONG CHO THEM
CREATE TRIGGER KTNGAY


ON HD FOR INSERT
AS


BEGIN


DECLARE @NL DATE, @NG DATE


SELECT @NL =H.NGAYLAP FROM HD H JOIN inserted I ON H.MAHD
=I.MAHD


SELECT @NG =H.NGAYGIAO FROM HD H JOIN inserted I ON H.MAHD
=I.MAHD


IF (@NL>@NG)
BEGIN


PRINT 'NGAY GIAO PHAI LON HON HAY BANG NGAY LAP'
ROLLBACK TRAN



END
END


SET DATEFORMAT DMY


</div>
<span class='text_page_counter'>(23)</span><div class='page_container' data-page=23>

SELECT * FROM HD


INSERT HD VALUES(1,'A','15/4/2018','10/5/2018')
SELECT * FROM HD




--CREATE TABLE SP (MASP INT, TENSP NVARCHAR(40),SLTON SMALLINT)
SELECT * FROM SP


INSERT SP SELECT PRODUCTID, ProductName,UnitsInStock
FROM Products WHERE ProductName LIKE 'A%'


--DO DU LIEU VAO 1 BANG CHUA CO


SELECT PRODUCTID, ProductName,UnitsInStock INTO SPM
FROM Products WHERE ProductName LIKE 'A%'


SELECT * FROM SPM
--TAO BANG CTHD


CREATE TABLE CTHD (MAHD INT,MASP INT, SL INT, DG MONEY)
CREATE TRIGGER KTSLTON


ON CTHD FOR INSERT


AS


BEGIN


DECLARE @SL INT, @SLT INT


SELECT @SLT = SLTON FROM SP WHERE MASP IN (SELECT MASP
FROM INSERTED)


SELECT @SL =SL FROM INSERTED
IF(@SL>@SLT)


BEGIN


PRINT 'HET HANG'
ROLLBACK TRAN
END


END


--KIEM TRA TRIGGER


INSERT CTHD VALUES(1,3,180,300)
INSERT CTHD VALUES(1,3,80,300)
SELECT * FROM CTHD


--TAO 1 TRIGGER KHI BAN 1 SP THÌ TỰ ĐỘNG CẬP NHẬP LẠI SỐ LƯỢNG TÔN
CREATE TRIGGER SUASLTON


ON CTHD FOR INSERT


AS


BEGIN


DECLARE @SL INT, @SLT INT


SELECT @SLT = SLTON FROM SP WHERE MASP IN (SELECT MASP
FROM INSERTED)


SELECT @SL =SL FROM INSERTED
IF(@SL>@SLT)


</div>
<span class='text_page_counter'>(24)</span><div class='page_container' data-page=24>

PRINT 'HET HANG'
ROLLBACK TRAN
END


ELSE
BEGIN


UPDATE SP


SET SLTON =SLTON-@SL


WHERE MASP IN (SELECT MASP FROM INSERTED)
END


END


DELETE FROM CTHD
SELECT * FROM CTHD


--KIEM TRA TRIGGER


INSERT CTHD VALUES(1,3,180,300)
INSERT CTHD VALUES(1,3,80,300)
SELECT * FROM CTHD


SELECT * FROM SP


--VIẾT MỘT TRIGGER TƯ ĐỘNG CẬP NHẬP CỘT TONG TIEN CHO 1 HO DON
KHI HOA DON NAY MUA HANG


SELECT * FROM HD


ALTER TABLE HD ADD TONGTIEN MONEY
CREATE TRIGGER CAPNHAPTIEN


ON CTHD FOR INSERT
AS


BEGIN


DECLARE @TT MONEY


SELECT @TT =SUM(C.SL*C.DG) FROM CTHD C JOIN INSERTED I
ON C.MAHD=I.MAHD


UPDATE HD


SET TONGTIEN = @TT



WHERE MAHD IN (SELECT MAHD FROM INSERTED)
END


SELECT * FROM SP
SELECT * FROM HD
SELECT * FROM CTHD


INSERT CTHD VALUES(1,17,5,10)


--VIẾT 1 TRIGGER KHI XÓA 1 HÓA DON THI TU DONG XOA LUON CAC MAU
TIN TUONG UNG BEN BANG CTHD


CREATE TRIGGER XOA
ON HD FOR DELETE
AS


</div>
<span class='text_page_counter'>(25)</span><div class='page_container' data-page=25>

IF EXISTS(SELECT * FROM HD WHERE MAHD IN (SELECT MAHD
FROM DELETE))


DELETE FROM CTHD WHERE MAHD IN (SELECT MAHD FROM
DELETED)


ELSE
BEGIN


PRINT 'KHONG CO HD NAY'
ROLLBACK TRAN


END
END



SELECT * FROM HD
SELECT * FROM CTHD


DELETE FROM HD WHERE MAHD=1
select * from Production.Product


drop table sptam


Select * into spTam from Production.Product
select * from spTam


delete from sptam where productid =4
drop trigger Xoasp


CREATE TRIGGER XoaSp1
ON spTam


FOR DELETE
AS


IF(SELECT ProductID FROM Deleted)=1
BEGIN


Print 'Bạn khơng xóa được sp có mã Productid=1'
RollBack transaction


END


delete from spTam where ProductId =1


select * from sptam


delete from spTam where productid =317
select * from spTam


CREATE TRIGGER XoaSp1
ON SpTam


FOR DELETE AS


IF(SELECT ProductID FROM Deleted )=1
BEGIN


Print 'You cannot delete the Productid=1'
RollBack transaction


END


</div>
<span class='text_page_counter'>(26)</span><div class='page_container' data-page=26>

select * from spTam


delete from SpTam where ProductId =1


--Sp_helptext XoaSp
Sp_helptext XoaSp1


Sp_helptrigger XoaSp1
Sp_depends Xoasp1


CREATE TRIGGER Themxoasuasptam


ON sptam FOR INSERT, UPDATE,delete
AS


Raiserror ('Co %d dòng đã được hiệuchỉnh',0,1,
@@rowcount)


RETURN


select * from sptam
update sptam
set color ='red'


where productid in(1,2,3)


delete from sptam where productid =2


--DROP TABLE LOP1


CREATE TABLE LOP1(MALOP CHAR(5), TENLOP NVARCHAR(30), SISO INT)
DROP TABLE SV1


CREATE TABLE SV1(MASV INT , TENSV NVARCHAR(40), MALOP CHAR(5))
--vIET 1 TRIGGER THEM VAO LOP 1 LOP MOI NEU MA LOP CO ROI THA BAO
LOI


ALTER TRIGGER KTLOP1
ON LOP1


INSTEAD OF INSERT


AS


IF(EXISTS (SELECT * FROM INSERTED I JOIN LOP1 L ON
I.MALOP=L.MALOP))


BEGIN


PRINT 'lOP NAY CO ROI, BAN NHAP MA KHAC'
ROLLBACK TRAN


END


--KIEM TRA TRIGGER
SELECT * FROM LOP1


</div>
<span class='text_page_counter'>(27)</span><div class='page_container' data-page=27>

ALTER TRIGGER THEMsv1
ON SV1


FOR INSERT,UPDATE,DELETE
AS


BEGIN


-- DECLARE @SOSV INT


--SELECT @SOSV =COUNT(MALOP) FROM INSERTED
UPDATE LOP1


SET SISO =SISO +1



WHERE MALOP IN (SELECT MALOP FROM INSERTED)
END


SELECT * FROM LOP1


INSERT SV1 VALUES(1,'LAN','A')
INSERT SV1 VALUES(2,'MINH','A')
DELETE FROM SV1 WHERE MASV=1


--drop table hd


select salesOrderid,customerid,orderdate,shipdate into hd from Sales.SalesOrderHeader
drop trigger Trg_NgayLap_NgayGiaoHD


CREATE TRIGGER Trg_NgayLap_NgayGiaoHD
ON hd AFTER INSERT


AS


DECLARE @NgayLapHD DateTime, @NgayGiao DateTime
SELECT @NgayLapHD=h.orderdate, @NgayGiao=h.shipdate


FROM hd h INNER JOIN Inserted i ON h.SalesOrderid=i.Salesorderid
If @NgayGiao<@NgayLapHD


BEGIN


RAISERROR(500103,10,1)



print N'Ngày lập phải lớn hơn hay bằng ngày hiện hành'
ROLLBACK TRANSACTION


END
set dateformat dmy
select * from hd


INSERT Hd (CustomerID,orderdate,shipdate) values
(1,'1/12/2017','30/9/2017')


--Kiem tra su ton tại
drop table SpTam


select productid,Name into sptam from Production.Product
select * from SPTam


drop trigger KTTT
--Kiem tra khóa chính


</div>
<span class='text_page_counter'>(28)</span><div class='page_container' data-page=28>

IF EXISTS (SELECT * FROM INSERTED I JOIN SPTam S ON S.Productid
=I.Productid)


BEGIN


SELECT 'CO SP NAY ROI, NHAP MA KHAC'
ROLLBACK TRANSACTION


END


SELECT * FROM SPtam WHERE productid=1


set identity_insert SPTam on


INSERT INTO SPTam(productid,name) VALUES (1,'TAO')
SELECT * FROM SPtam WHERE productid=1




--CREATE TRIGGER ktTonTai ON hd FOR INSERT AS
IF EXISTS (SELECT * FROM INSERTED I inner join hd o


ON i.SalesOrderid = o.SalesOrderid )
BEGIN


print 'Hoa don nay co roi, nhap lai'
ROLLBACK TRANSACTION
END


set IDENTITY_INSERT SpTam Off
set IDENTITY_INSERT hd On


INSERT Hd (Salesorderid, CustomerID,orderdate,shipdate) values
(1,1,'1/1/2016','1/10/2016')


select * from hd


CREATE TABLE LOP(MALOP INT PRIMARY KEY, TENLOP NVARCHAR(20))
CREATE TABLE SV1(MASV NCHAR(5) PRIMARY KEY, TENSV


NVARCHAR(40), MALOP INT FOREIGN KEY (MALOP) REFERENCES
LOP(MALOP))



CREATE TRIGGER XOALOP
ON LOP


FOR DELETE
AS


IF EXISTS (SELECT * FROM DELETED WHERE MALOP IN
(SELECT MALOP FROM SV1))


BEGIN


PRINT'KHONG XOA DUOC'
ROLLBACK TRANSACTION
END


SP_HELPCONSTRAINT SV1


DELETE FROM LOP WHERE MALOP=1


</div>
<span class='text_page_counter'>(29)</span><div class='page_container' data-page=29>

CREATE TRIGGER XOALOP
ON LOP


FOR DELETE
AS


IF EXISTS (SELECT * FROM DELETED WHERE MALOP IN
(SELECT MALOP FROM SV1))


BEGIN



DELETE FROM SV1 WHERE MALOP IN (SELECT MALOP FROM
DELETED)


END


SELECT * FROM SV1
SELECT * FROM LOP
use Northwind


--vd1


CREATE TRIGGER ThemxoaCTHD ON [Order Details] FOR INSERT, UPDATE
AS


Raiserror ('Co %d dòng dã du?c hi?u ch?nh',0,1,@@rowcount)
RETURN


--kiem tra


insert into [order details] values(10249,1,120,50,0.5)
--xay dung thong bao loi


sp_addmessage 500103,10,'ngày giao ph?i l?n hon ngày l?p'
--vd2


CREATE TRIGGER Trg_NgayLap_NgayGiaoHD
ON Orders AFTER INSERT


AS



DECLARE @NgayLapHD DateTime, @NgayGiao DateTime


SELECT @NgayLapHD=hd.Orderdate, @NgayGiao=hd.Requireddate
FROM Orders hd INNER JOIN Inserted i ON hd.Orderid=i.orderid
If @NgayGiao<@NgayLapHD


BEGIN


RAISERROR(500103,10,1)
ROLLBACK TRANSACTION
END


--kiem tra


set IDENTITY_INSERT orders on
insert


</div>
<span class='text_page_counter'>(30)</span><div class='page_container' data-page=30>

insert


orders(orderid,customerid,employeeid,orderdate,requireddate)values(10178,'tomsp',3,'1/1
/2005','12/3/2005')


--insert


sp_addmessage 60001,16,'Khong them duoc %ls vao bang %ls vi Chua co %s trong bang
%ls'


CREATE TRIGGER kttontai ON [Order details] FOR INSERT AS
BEGIN



IF NOT EXISTS (SELECT * FROM INSERTED I inner join Orders o
ON i.Orderid = o.Orderid )


begin


Raiserror(60001,16,1,'Orderid','Order details','Orderid','Orders')
ROLLBACK TRANSACTION


end
END
--kiem tra


insert into [order details] values(33333,12,200,20,0.7)
insert into [order details] values(10250,12,200,20,0.7)


----xoa


create TRIGGER Trg_Xoa_HD
ON Orders AFTER DELETE
AS


SET NOCOUNT ON


IF EXISTS (SELECT * FROM Deleted)
BEGIN


DELETE [Order Details] WHERE [Order details].Orderid
IN (SELECT hd.Orderid FROM orders hd



INNER JOIN Deleted d ON hd.Orderid=d.Orderid)
RAISERROR('Cac chi tiet HD da bi xoa',10,1)


END


SET NOCOUNT ON


---kiem tra cac rang buoc truoc khi chay cac trigger
alter table orders nocheck constraint all


alter table [order details] nocheck constraint all
DELETE Orders WHERE Orderid=10248


----CREATE TRIGGER NoDelete12
ON Products


</div>
<span class='text_page_counter'>(31)</span><div class='page_container' data-page=31>

IF (SELECT Productid FROM deleted) = 12
BEGIN


PRINT 'You cannot delete the Productid =12'
ROLLBACK TRANSACTION


END


--delete from products where productid =12
--kiem tra ton tai



Create TRIGGER NoUpdateCuscode
ON Customers


FOR UPDATE AS


IF UPDATE (Customerid)
BEGIN


PRINT 'You cannot modify Customerid codes'
ROLLBACK TRANSACTION


END
--kiem tra


update Customers set Customerid = 'abc' where CompanyName ='Alfreds Futterkiste'


--drop trigger NoUpdateOrdersd
CREATE TRIGGER NoUpdatePro
ON [Products]


FOR UPDATE AS


IF (SELECT Unitprice FROM inserted) > 0
BEGIN


PRINT 'Don gia phai lon hon hay bang khong'
ROLLBACK TRANSACTION


END


--kiem tra
Update Products


set unitprice =0 where Productid =10


--CREATE VIEW sp_cthd
AS


SELECT o.Productid as ma1, p.Productid as ma2, ProductName , orderid
FROM Products p JOIN [order details] o


ON p.productid =o.productid


</div>
<span class='text_page_counter'>(32)</span><div class='page_container' data-page=32>

ON sp_cthd


INSTEAD OF DELETE
AS


DELETE Products WHERE Productid IN
(SELECT ma2 FROM DELETED)
DELETE [order details] WHERE productid IN


(SELECT ma1 FROM DELETED)


--delete from products where productid =11



--CREATE TRIGGER InsOrdDet ON [Order Details]
INSTEAD OF INSERT


AS


DECLARE @qty int


SELECT @qty=quantity FROM Inserted


IF @qty<= (SELECT UnitsInStock FROM Products P JOIN Inserted I ON P.ProductID
= I.ProductID)


INSERT INTO [Order Details]
SELECT * FROM Inserted
ELSE


RAISERROR('Not enough products in stock', 16, 1)
insert into [order details] values(10248,2,12,4545,0.1)


select * from [order details] where orderid =10248 and productid =2


--CREATE VIEW [Alphabetical list of products1]
AS


SELECT Products.*, Categories.CategoryName
FROM Categories INNER JOIN Products


ON Categories.CategoryID = Products.CategoryID
WHERE Products.Discontinued=0





--CREATE TRIGGER InsLP1 ON [Alphabetical list of products1]
INSTEAD OF INSERT


AS


IF EXISTS(SELECT * FROM Inserted I JOIN Category C
ON I.CategoryID=C.CategoryID)


INSERT INTO Products(ProductID, ProductName, SupplierID,
CategoryID, QuantityPerUnit, UnitPrice, UnitsInStock,


UnitsOnOrder, ReorderLevel, Discontinued)
SELECT ProductID, ProductName, SupplierID,


CategoryID, QuantityPerUnit, UnitPrice, UnitsInStock,
UnitsOnOrder, ReorderLevel, Discontinued


</div>
<span class='text_page_counter'>(33)</span><div class='page_container' data-page=33>

ELSE
begin


BEGIN TRANSACTION


INSERT INTO Category(CategoryName)
SELECT CategoryName FROM Inserted


INSERT INTO Products(ProductID, ProductName, SupplierID,
CategoryID, QuantityPerUnit, UnitPrice,



UnitsInStock, UnitsOnOrder, ReorderLevel, Discontinued)
SELECT ProductID, ProductName, SupplierID,


@@IDENTITY, QuantityPerUnit, UnitPrice,
UnitsInStock, UnitsOnOrder, ReorderLevel,
Discontinued FROM Inserted


COMMIT TRANSACTION
END


BÀI TẬP
<b>HÀM</b>


1) Hàm Function_HọTên_MSSV_1a trả về tổng số lần đặt hàng của một khách hàng tùy ý
<b>( tham số truyền là CustomerID) (1đ)</b>


2) Hàm Function_HọTên_MSSV_1b trả về kết quả là một bảng gồm các sản phẩm (Products)
<b>của một nhà cung cấp (Suppliers) nào đó mà đã được bán (đã được đặt hàng). (1đ)</b>


3) Viết hàm trả về thưởng của một nhân viên tùy ý trong một tháng và một năm bất kỳ (truyền
vào MaNV, tháng, năm). Thưởng của mỗi nhân viên được tính theo qui tắc sau: nếu tổng tiền
thu được của 1 nhân viên trên 5000000 thì thì thưởng là 1000000, từ 2 tới 5 thì thưởng là
500000, còn lại là 0.


4) Viết hàm trả về kết quả là một bảng (Table), viết bằng Inline Table-Valued Functions hoặc
Multistatement Table-Valued. Thông tin gồm: MaNV, HoTen, NgaySinh, TongLuongTB.
5) Viết hàm trả về chiết khấu dựa vào số lượng lập hoá đơn và theo quy định sau:


Chiết khấu = 5%* GIABAN nếu Soluong <5


Chiết khấu = 6%* GIABAN nếu 10>Soluong >=5
Chiết khấu = 8%* GIABAN nếu 15>Soluong>=10
Chiết khấu =10%* GIABAN nếu Soluong>=15
Viết lệnh gọi các hàm trên


Thủ tục:


</div>
<span class='text_page_counter'>(34)</span><div class='page_container' data-page=34>

2) Viết thủ tục dùng để cập nhật ngày giao hàng là ngày lập hóa đơn cộng thêm 5 (ngày) cho
những hóa đơn của khách hàng ở một thành phố bất kỳ. Tham số truyền vào là field
thành phố.


3) Viết một thủ tục dùng để lấy về tổng số lượng đơn đặt hàng và tổng tiền của một
khách hàng nào đó trong một năm bất kỳ.


4) Viết thủ tục dùng để xóa 1 hóa đơn khi biết MaHD. Lưu ý trước khi xóa mẫu tin
trong hóa đơn thì phải xóa các mẫu tin của các chi tiết hóa đơn đó. Nếu khơng
xố được hóa đơn thì cũng khơng được phép xóa chi tiết hóa đơn của hóa đơn đó.
5) Viết thủ tục có tham số dùng để cập nhật dữ liệu mới của một mẫu tin nào đó khi


biết MaKh trong bảng Orders.
<b>TRIGGER</b>


<b>1) Thêm vào cột Total_Order trong bảng Orders. Tạo triggers trên bảng Order Details </b>
cho thao tác Insert, Update, Delete sao cho khi có thao tác thêm, cập nhật hay xóa dữ
liệu trên bảng Order Details thì dữ liệu của cột Total_Order trong bảng Orders được
sửa đổi tương ứng. Total_Order là tổng tiền phải trả cho mỗi OrderID =


Sum(UnitPrice – Discount)*Quantity.


<b>2) Thêm một cột TongLuong vào trong bảng Employees. Viết trigger cho thao tác insert</b>


trên bảng Orders. Khi có mẫu tin được thêm vào thì TongLuong được tính bằng cơng
thức sau:


TongLuong =20% *sum(quantity*unitprice) của mỗi nhân viên


<b>3) Viết trigger cho thao tác Insert, Update, Delete trên bảng [Order Details]</b>
(CHITIETHOADON). Khi có mẫu tin được chèn vào hoặc hiệu chỉnh hoặc
xố thì cập nhật lại cột TongTriGia trong bảng Orders với TongTriGia =
Tổng tiền của Số lượng * Đơn giá. Lưu ý: nếu bảng Orders chưa có cột
TongTriGia thì bổ sung vào trước khi kiểm chứng trigger.


<b>4) Viết 1 trigger ràng buộc liên thuộc tính là ngày bán của một HOADON thì ln</b>
ln lớn hơn hay bằng ngày lập hóa đơn .


</div>

<!--links-->

×