You are on page 1of 34

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
DROP VIEW HD_KH
--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
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.
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:
Insert into DonVi (Madv, Tendv, DienThoai) values (1,'P.Kinh doanh','822321')
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)
)
Create Table KH_TRUNG
(Makh int, TenKh Nchar(30),
Khuvuc Nvarchar(30) NOT NULL
CHECK (Khuvuc='Trung bo'),
PRIMARY KEY (Makh, Khuvuc))
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.
Thông tin gồm CustomerID, YEAR(OrderDate) AS OrderYear,
MONTH(OrderDate) AS OrderMonth,
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).
Sau đó xem thông tin và trợ giúp về mã lệnh của
view này
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
CREATE VIEW vwProducts
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,
tendv NVARCHAR(30) NOT NULL,
dienthoai NVARCHAR(10) NULL
)
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
DELETE FROM nv2 WHERE manv='NV04' –Thực hiện được

II. THỦ TỤC


--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
--xem tro giup thu tuc
sp_helptext tong
--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
exec Tong1 @a,@b
--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
--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
set @b=7
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
exec Tinhtoan @a,@b,@tong output
print 'tong ='+convert(char(6),@tong)
--
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


--
sp_helptext tiendien
--
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)
from employees
--
--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
--
select orderid, tongtien =SUM(unitprice*quantity)
from dbo.[Order Details]
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.
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.
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
END
--
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),
thông tin gồm OrderID, Quantity, Discount,
trong đó, Discount được tính như sau:
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
SELECT * FROM BAI7(@T,@N)
SELECT * FROM BAI7(6,1997)
--CACH 2: DUNG MULTI TABLE
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
--
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
INSERT HD VALUES(1,'A','15/5/2018','10/5/2018')
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)
BEGIN
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
BEGIN
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
delete from spTam where masp =319
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
INSERT LOP1 VALUES ('A','THB',40)
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
CREATE TRIGGER KTTT ON SPTam FOR INSERT AS
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
ALTER TABLE SV1 DROP CONSTRAINT FK__SV1__MALOP__1D9B5BB6

DROP TRIGGER XOALOP


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
orders(orderid,customerid,employeeid,orderdate,requireddate)values(10178,'tomsp',3,'1/1
/2005','12/3/2004')
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
FOR DELETE AS
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
--
CREATE TRIGGER del_service
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
FROM Inserted
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
HÀM
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 ý
( tham số truyền là CustomerID) (1đ)
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)
của một nhà cung cấp (Suppliers) nào đó mà đã được bán (đã được đặt hàng). (1đ)
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:
1) Viết thủ tục SUM_SALARY để tính tổng tiền (20% *sum(quantity*unitprice) )phải trả
cho nhân viên với tham số truyền vào là mã nhân viên.
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
xoá đượ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.

TRIGGER
1) Thêm vào cột Total_Order trong bảng Orders. Tạo triggers trên bảng Order Details
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.
2) Thêm một cột TongLuong vào trong bảng Employees. Viết trigger cho thao tác insert
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
3) Viết trigger cho thao tác Insert, Update, Delete trên bảng [Order Details]
(CHITIETHOADON). Khi có mẫu tin được chèn vào hoặc hiệu chỉnh hoặc
xoá 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.
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ì luôn
luôn lớn hơn hay bằng ngày lập hóa đơn .
5) Viết 1 trigger cho lệnh insert, delete trên bảng [order Details) thi thêm hay xóa dữ
liệu trên bảng này phải nhập số lượng tồn (UnitInStock) trong bảng Products

You might also like