Chương 5 - LẬP TRÌNH T-SQL
Lecturer: Email: Website:
Nguyễn Đức Cương - FIT cuongnguyenduc@gmail.com http://www.nguyenduccuong.com
Nội dung
Tổng quan
Biến
Cấu trúc điều khiển
Thủ tục (store procedures)
Hàm(function)
Nguyễn Đức Cương – cuongnguyenduc@gmail.com Slide 2
TỔNG QUAN
1. Sử dụng T-SQL để lập trình các script và sp thực hiện các tác vụ đặc thù trên server. Chương trình bao gồm lệnh sql, biến, cấu trúc điều khiển .
a. Định danh (identifiers): tên các đối tượng
2. Các khái niệm cơ bản:
Quy tắc:
Tối đa 128 ký tự Bắt đầu từ ký tự a z, hoặc các ký tự @, # Các định danh có khoảng trắng phải đặt trong []
Nguyễn Đức Cương – cuongnguyenduc@gmail.com Slide 3
trong CSDL
TỔNG QUAN
Kiểu dữ liệu: có 2 loại
System- supplied data type
User – defined data type
Batch: tập các câu lệnh T-SQL liên tiếp kết thúc bằng lệnh GO
Nguyễn Đức Cương – cuongnguyenduc@gmail.com Slide 4
Script: tập của 1 hoặc nhiều các bó lệnh được lưu thành một tập tin .SQL
BIẾN (Variable)
Biến: có 2 loại biến: biến cục bộ và biến toàn cục
– Được khai báo bên trong một sp , một batch
–
1. Biến cục bộ (Local variable):
–
Phạm vi hoạt động từ vị trí khai báo đến khi kết thúc sp, batch
Tên bắt đầu bằng ký tự @
Khai báo biến: DECLARE @ VariableName var_type
Nguyễn Đức Cương – cuongnguyenduc@gmail.com Slide 5
Ví dụ: DECLARE @vEmpID int
BIẾN (Variable)
Gán giá trị cho biến:
SET @VariableName = expression Hoặc: SELECT{@VariableName=expression} [,…n]
Ví dụ 1:
Nguyễn Đức Cương – cuongnguyenduc@gmail.com Slide 6
DECLARE @temp_name varchar(20) SELECT @temp_name = companyname FROM customers WHERE customerid = ‘adsff’
BIẾN (Variable)
Ví dụ 2:
DECLARE @temp_city varchar(10)
SET @temp_city = ‘london’
SELECT * FROM Customers
WHERE city = @temp_city
Ví dụ 3:
DECLARE @temp_CustID Char(5), @temp_name
varchar(50)
SET @temp_CustID = ‘ALFKI’
SELECT @temp_name = CompanyName FROM Customers
Where CustomerID = @temp_CustID
PRINT ‘CustomerID is ‘ + @temp_CustID + ‘ and Name is ‘+
@temp_name
Nguyễn Đức Cương – cuongnguyenduc@gmail.com Slide 7
BIẾN (Variable)
2. Biến toàn cục (Global Variables): Thực chất là các
hàm có sẵn trong SQL Server.
– Không thể gán giá trị cho biến – Biến toàn cục không có kiểu – Tên biến bắt đầu bằng @@
@@VERSION:
Nguyễn Đức Cương – cuongnguyenduc@gmail.com Slide 8
Ví dụ: Select @@ version
BIẾN (Variable)
@@SERVERNAME: tên sever
@@ROWCOUNT: trả về số dòng bị ảnh hưởng bởi
Ví dụ: select @@SERVERNAME
lệnh thực thi gần nhất
Ví dụ: Update Employees set LastName = ‘Brooke’ Where LastName =‘Brook’ If(@@rowcount=0)
begin
print ‘Không dòng nào được cập nhật’ return
Nguyễn Đức Cương – cuongnguyenduc@gmail.com Slide 9
end
BIẾN (Variable)
@@ERROR: trả về số thứ tự lỗi của lệnh thực thi sau cùng, nếu trả về 0 thì câu lệnh hoàn thành
@@IDENTITY: trả về số IDENTITY phát sinh sau
Nguyễn Đức Cương – cuongnguyenduc@gmail.com Slide 10
cùng
Cấu trúc điều khiển
CASE Function: Có 2 dạng
a) Simple CASE function: CASE input_expression
WHEN when_expression THEN
result_expression [ ...n ]
[ELSE else_result_expression ]
END
b) Searched CASE function:
CASE
WHEN Boolean_expression THEN result_expression [ ...n ] [ ELSE else_result_expression ]
Nguyễn Đức Cương – cuongnguyenduc@gmail.com Slide 11
END
Cấu trúc điều khiển
Ví dụ 1: SELECT Category =
CASE type
WHEN 'popular_comp' THEN 'Popular Computing' WHEN 'mod_cook' THEN 'Modern Cooking' WHEN 'business' THEN 'Business' WHEN 'psychology' THEN 'Psychology' WHEN 'trad_cook' THEN 'Traditional Cooking ELSE 'Not yet categorized‘
END CAST(title AS varchar(25)) AS 'Shortened Title', price AS Price FROM titles WHERE price IS NOT NULL ORDER BY type, price COMPUTE AVG(price) BY type
Nguyễn Đức Cương – cuongnguyenduc@gmail.com Slide 12
Cấu trúc điều khiển
Ví dụ 2: SELECT ProductID, Quantity, UnitPrice, [discount%]=
CASE
WHEN Quantity <=5 THEN 0.05 WHEN Quantity BETWEEN 6 and 10 THEN 0.07 WHEN Quantity BETWEEN 11 and 20 THEN 0.09
ELSE 0.1 END
Nguyễn Đức Cương – cuongnguyenduc@gmail.com Slide 13
FROM [Order Details] ORDER BY Quantity, ProductId
Cấu trúc điều khiển
IF … ELSE:
IF boolean_expression
{sql_statement | statement_block}
[ELSE boolean_expression
{sql_statement | statement_block}]
BEGIN …END: Khối lệnh
BEGIN
{sql_statement | statement_ block}
Nguyễn Đức Cương – cuongnguyenduc@gmail.com Slide 14
END
Cấu trúc điều khiển
Ví dụ: IF ( SELECT COUNT(*) FROM authors WHERE contract =0) >0
BEGIN
PRINT 'These authors do not have contracts on file: ' SELECT au_lname, au_fname, au_id FROM authors WHERE contract=0
END ELSE BEGIN
PRINT 'All authors have contracts on file.'
Nguyễn Đức Cương – cuongnguyenduc@gmail.com Slide 15
END
Cấu trúc điều khiển
WHILE: WHILE boolean_expression
Nguyễn Đức Cương – cuongnguyenduc@gmail.com Slide 16
{sql_statement | statement_block} [BREAK] {sql_statement | statement_block} [CONTINUE]
Cấu trúc điều khiển
Ví dụ 1: DECLARE @Counter INT SET @counter=0 WHILE (@counter<20)
BEGIN
INSERT INTO Pubs VALUES ('last'+CAST(@counter as char(2)), 'First') SET @counter=@counter+1
Nguyễn Đức Cương – cuongnguyenduc@gmail.com Slide 17
END
Cấu trúc điều khiển
Ví dụ 2
WHILE (SELECT AVG(price) FROM titles) < $30 BEGIN
UPDATE titles SET price = price * 2 IF (SELECT MAX(price) FROM titles) > $50
BREAK
ELSE
CONTINUE
Nguyễn Đức Cương – cuongnguyenduc@gmail.com Slide 18
END
Cấu trúc điều khiển
PRINT: In thông tin ra màn hình kết quả của SQL
PRINT ‘any ACII
Text’|@local_variable|@@FUNTION| String_expr RETURN:
RETURN [integer_expression]
WAITFOR: SQL tạm dừng
WAITFOR { DELAY 'time' | TIME 'time' }
Ví dụ:
BEGIN
WAITFOR TIME '22:20' EXECUTE update_all_stats
Nguyễn Đức Cương – cuongnguyenduc@gmail.com Slide 19
END
Cấu trúc điều khiển
RAISERROR: Gửi lỗi đến người dùng như một lỗi
hệ thống
RAISERROR({msg_id | msg_str} { , severity ,
state }
[ , argument [ ,...n ] ] )
– Msg_id: mã thông báo, được lưu trong bảng
sysmessage mã thông báo của người dùng được bắt đầu trên 50000
– Msg_str: Nội dung thông báo, tối đa 400 ký tự
Để truyền tham số vào trong thông báo dùng dạng
%
Nguyễn Đức Cương – cuongnguyenduc@gmail.com Slide 20
[ WITH option [ ,...n ] ]
Cấu trúc điều khiển
– D hoặc I: số nguyên
– O: Octal không dấu
–
– Loại ký tự:
–
P : Con trỏ
–
S: chuổi
Nguyễn Đức Cương – cuongnguyenduc@gmail.com Slide 21
U : số nguyên không dáu
Bài tập
Bài 1: Khai báo một biến @maso kiểu số nguyên, gán giá trị 7 cho biến @maso, viết câu lệnh lấy ra danh sách các sản phẩm có masp nhỏ hơn giá trị chứa trong biến @maso.
Giải
declare @maso int
set @maso=7
Nguyễn Đức Cương – cuongnguyenduc@gmail.com Slide 22
select * from products where productid<=@maso
Bài tập
Bài 2: Khai báo và giá giá trị đại diện cho nơi
Nguyễn Đức Cương – cuongnguyenduc@gmail.com Slide 23
chuyển hàng của hoá đơn. Kiểm tra xem nơi này có
bao nhiêu hoá đơn, giả sử là n. In ra cau thông báo
cho biết ‘Có
Bài tập
Nguyễn Đức Cương – cuongnguyenduc@gmail.com Slide 24
GIẢI declare @NoiChuyen int declare @SoHD int set @NoiChuyen=1 set @sohd=(select count(orderid) as sohoadon from orders where ShipVia=@NoiChuyen) if (@sohd)>0 select 'Co '+cast(@sohd as nvarchar(10))+ ' hoa don' else select 'Khong co hoa don'
Bài tập
Bài 3: Viết một vòng lặp WHILE để nhập 10 mẫu
1 Hoc vien 1
tin tùy ý vào bảng HOCVIEN (MAHV, TENHV, LOP), với bảng dữ liệu như sau:
2 Hoc vien 2
CDTH3
….
CDTH3
10.
…. …. …..
Nguyễn Đức Cương – cuongnguyenduc@gmail.com Slide 25
Hoc vien 10 CDTH3
Bài tập
Nguyễn Đức Cương – cuongnguyenduc@gmail.com Slide 26
GIẢI create table HOCVIEN (MAHV int , TENHV nvarchar(12), LOP nvarchar(5)) go declare @i int set @i=1 while(@i<=10) begin insert hocvien values(@i,'Hoc Vien ' + cast(@i as nvarchar(12)), 'CDTH3') set @i=@i+1 end GO
Bài tập
Bài 5: Viết một câu lệnh SELECT có sử dụng CASE dùng để hiển thị MaSP, TenSp, Soluong, Dongia, Huehong. Trong đó HueHong = Soluong * DonGia*TiLe, TiLe = 5% nếu Soluong <5
= 6% nếu 10>soluong >=5
= 8% NẾU 15>Soluong>=10
Nguyễn Đức Cương – cuongnguyenduc@gmail.com Slide 27
=10% nếu Soluong>=15
Bài tập
GIẢI select p.ProductID as MaSP,ProductName as TenSp,Quantity as Soluong, p.UnitPrice as Dongia,Huehong =Quantity*p.UnitPrice*case when Quantity<5 then 0.05 when Quantity>=5 and Quantity<10 then 0.06 when Quantity>=10 and Quantity<15 then 0.08
Nguyễn Đức Cương – cuongnguyenduc@gmail.com Slide 28
else 0.1 end from "Order Details" o,Products p where o.productid=p.productid
LẬP TRÌNH T-SQL
THỦ TỤC VÀ HÀM (STORED PROCEDURES AND FUNCTION)
Nguyễn Đức Cương – cuongnguyenduc@gmail.com Slide 29
Giới thiệu
–
– Thực thi nhanh hơn
– Giảm lưu lượng trên mạng
– An ninh bảo mật hơn
Nguyễn Đức Cương – cuongnguyenduc@gmail.com Slide 30
Lập trình theo module
A. STORE PROCEDURE
1. ĐẶC ĐIỂM:
–
– Gọi thủ tục khác.
–
Truyền tham số.
–
Trả về các giá trị tham số, chuyển giá trị tham số c ho các thủ tục được gọi.
Nguyễn Đức Cương – cuongnguyenduc@gmail.com Slide 31
Trả về giá trị trạng thái thủ tục là thành công hay không thành công
A. STORE PROCEDURE
System SP: lưu trong CSDL Master (sp)
2/CÁC LOẠI SP:
Ví dụ: Muốn biết tất cả các tiến trình đang thực
vd: master.dbo.sp_helptext
Extended SP: biên dịch thành các file .DLL
Để xem tên file dll tương ứng dùng
hiện bởi user nào: sp_who @loginame='sa'
Nguyễn Đức Cương – cuongnguyenduc@gmail.com Slide 32
sp_helptext ESP_name
A. STORE PROCEDURE
User_defined : có thể là local, temporary, remote
Local sp: được người dùng tạo ra như là một đối tượng của database, dùng thực thi các task trong database, có thể tạo sp ngay trong master db.
Temporary sp: Có 2 loại: local và global (tên bắt
2/CÁC LOẠI SP:
Nguyễn Đức Cương – cuongnguyenduc@gmail.com Slide 33
đầu bằng # và ##).
A. STORE PROCEDURE
3/Tạo stored Procedures
– – –
Tạo sp bằng Managerment Studio Tạo bằng wizard Bằng lệnh T_SQL: Trong QA có thể test trước khi thi hành sp.
Cú pháp :
CREATE PROCEDURE procedure_name [WITH option] AS
sql_statement [...]
Nguyễn Đức Cương – cuongnguyenduc@gmail.com Slide 34
Có thể viết tắt lệnh là CREATE PROC.
A. STORE PROCEDURE
3/Tạo stored Procedures
Ví dụ:
CREATE PROCEDURE OrderSummary AS
SELECT Ord.EmployeeID,
SummSales = SUM(OrDet.UnitPrice *
OrDet.Quantity)
Nguyễn Đức Cương – cuongnguyenduc@gmail.com Slide 35
FROM Orders AS Ord JOIN [Order Details] AS OrDet ON (Ord.OrderID = OrDet.OrderID) GROUP BY Ord.EmployeeID
A. STORE PROCEDURE
–
Xem nội dung thủ tục :
–
sp_helptext ‘Procedure_name’
Xem thông tin về người tạo :
–
sp_help ‘Procedure_name’
Xem các đối tượng mà các lệnh trong sp tham chiếu đến :
–
sp_depends Procedure_name
Nguyễn Đức Cương – cuongnguyenduc@gmail.com Slide 36
Liệt kê tất cả các sp trong database : sp_stored_procedures
A.
STORED PROCEDURES
4/Thi hành stored Procedures :
– Phải đặt lệnh thi hành sp ở dòng đầu của một query,
hay dòng đầu của một batch.
Ví dụ: sp_help Orders
Select * from Customers
USE Northwind GO Select * from Customers EXEC
sp_help Orders
Nguyễn Đức Cương – cuongnguyenduc@gmail.com Slide 37
– Bắt đầu dòng lệnh gọi sp bằng EXECUTE hay EXEC Ví dụ
A.
STORED PROCEDURES
–
Nếu gọi sp trong db khác, phải viết tên đầy đủ
db_name.owner.sp_name – Mã hoá để ngăn user đọc nội dung mã sp sử dụng
sql_statement [...n]
GO
Nguyễn Đức Cương – cuongnguyenduc@gmail.com Slide 38
WITH ENCRYPTION trong lệnh tạo sp Cú pháp: CREATE PROCEDURE procedure_name WITH ENCRYPTION AS
A.
STORED PROCEDURES
5/ Sửa đổi nội dung sp:
Cú pháp ALTER PROCEDURE procedure_name [WITH option] AS
sql_statement [...n]
Nguyễn Đức Cương – cuongnguyenduc@gmail.com Slide 39
GO
A. STORED PROCEDURES
6/ Xoá sp
DROP PROC
Nguyễn Đức Cương – cuongnguyenduc@gmail.com Slide 40
owner.stored_procedure_name Ví dụ: DROP Proc OrderSummary
A. STORED PROCEDURES
a)
7/ Sử dụng tham số trong sp
Input parameter: Dùng để truyền giá trị vào trong sp.
Cú pháp : CREATE PROCEDURE procedure_name [@parameter_name [=default_value]
data_type]
Nguyễn Đức Cương – cuongnguyenduc@gmail.com Slide 41
[WITH option] AS sql_statement [...n]
A. STORED PROCEDURES
Thủ tục không tham số CROC PROC Shopper As SELECT cFrirstName, vLastNam, vEmailID FROM cshopper
Thực thi
7/ Sử dụng tham số trong sp
Nguyễn Đức Cương – cuongnguyenduc@gmail.com Slide 42
EXEC Shopper
A. STORED PROCEDURES
Thủ tục có tham số
Thực thi
CROC PROC Shopper_city @vCity char(15) As SELECT cFrirstName, vLastNam, vEmailID FROM cshopper
Nguyễn Đức Cương – cuongnguyenduc@gmail.com Slide 43
EXEC Shopper ‘Woodbridge’
A. STORED PROCEDURES
7/ Sử dụng tham số trong sp
Gán giá trị theo thứ tự:
Gán giá trị theo tên biến
EXEC Shopper ‘Woodbridge’
Nguyễn Đức Cương – cuongnguyenduc@gmail.com Slide 44
Truyền tham số
A. STORED PROCEDURES
7/ Sử dụng tham số trong sp
b/Output parameter: Dùng để trả về giá trị.
Cú pháp :
CREATE PROCEDURE procedure_name
[@parameter_name data_type]
[=default_value] OUTPUT
[WITH option]
AS
Nguyễn Đức Cương – cuongnguyenduc@gmail.com Slide 45
sql_statement [...n]
A. STORED PROCEDURES
7/ Sử dụng tham số trong sp
VD :
int OUTPUT
CREATE PROC count_row @NumOfOrders AS SELECT @ NumOfOrders = COUNT(*) FROM Orders GO
Thực thi sp có tham số output: phải khai báo một biến để lưu giá trị trả về của tham số output.
DECLARE @num int EXEC count_row @num OUTPUT
Nguyễn Đức Cương – cuongnguyenduc@gmail.com Slide 46
SELECT @num GO
A. STORED PROCEDURES
III. Quản lý lỗi
SQL Server cung cấp một số công cụ để quản trị
lỗi:
Lệnh RETURN
Thủ tục sp_addmessage
Lệnh RAISERROR
1.
Function @@ERROR:
Nguyễn Đức Cương – cuongnguyenduc@gmail.com Slide 47
Lệnh RETURN: Được sử dụng để buộc sp kết thúc không điều kiện. Lệnh RETURN có thể kết thúc sp đồng thời trả về mã tình trạng (status code ) phục vụ cho xử lý khác.
A.
STORED PROCEDURES
VD: CREATE PROC ListCustomers @cus_id nchar(5) = NULL AS IF @cus_id IS NULL
BEGIN
PRINT ‘Hay nhap vao ma khach hang hop le!.’ PRINT ‘Dinh dang [a-z][a-z][a-z][a-z][a-z]’ RETURN
END
SELECT CustomerID, CompanyName, Phone
FROM Customers
Nguyễn Đức Cương – cuongnguyenduc@gmail.com Slide 48
WHERE CustomerID = @cus_id
A.
STORED PROCEDURES
VD2:
USE Northwind GO
CREATE PROC ListCustomers @cus_id nvarchar(5) = NULL AS
SELECT CustomerID, CompanyName, Phone FROM Customers WHERE CustomerID like @cus_id RETURN (@@rowcount)
Nguyễn Đức Cương – cuongnguyenduc@gmail.com Slide 49
GO
A.
STORED PROCEDURES
2.
Thi hành sp và xem mã tình trạng DECLARE @answer smallint EXEC @answer = ListCustomers ‘B%’ SELECT ‘Tong so khach hang ’, @answer
Sử dụng thủ tục sp_addmessage: Bạn có thể tạo các message thông báo lỗi (error msg) cho chuơng trình của mình bằng cách
Trong các sp, gọi hiển thị Trong các sp, gọi hiển thị các error msg các error msg
Định nghĩa trước các Định nghĩa trước các error msg và lưu vào error msg và lưu vào bảng sysmessage bảng sysmessage
RAISERROR
sp_addmessage
Nguyễn Đức Cương – cuongnguyenduc@gmail.com Slide 50
A.
STORED PROCEDURES
Cú pháp 1:
sp_addmessage
@msgnum = msg_id , @severity = severity , @msgtext = 'msg'
[ , [ @lang = ] 'language' ] [ , [ @with_log = ] 'with_log' ] [ , [ @replace = ] 'replace' ]
Cú pháp 2:
RAISERROR ( msg_id | msg_str , severity ,
state [ , argument [ ,...n ] ] )
Nguyễn Đức Cương – cuongnguyenduc@gmail.com Slide 51
[ WITH option [ ,...n ] ]
A.
STORED PROCEDURES
VD :
Tạo một error message bằng thủ tục sp_addmessage
EXEC sp_addmessage
@msgnum = 50001,
@severity = 10,
@msgtext=‘Khong the xoa. Khach hang co hoa don .’,
@withlog = ‘true’
Nguyễn Đức Cương – cuongnguyenduc@gmail.com Slide 52
GO
A.
STORED PROCEDURES
VD: Hiển thị error message trong một thủ tục xoá khách hàng
CREATE PROC DeleteCust @cust_num nvarchar(5) = null AS IF EXISTS (SELECT customerID FROM Orders WHERE
customerID like @cust_num)
BEGIN
RAISERROR (50001, 10, 1) RETURN
END
Nguyễn Đức Cương – cuongnguyenduc@gmail.com Slide 53
DELETE FROM Customers WHERE customerID like @cust_num GO
A. STORED PROCEDURES
3.
Sử dụng @@ERROR
WHERE au_id = "172-32-1176“
IF @@ERROR = 547 print “Phát hiện lỗi"
Nguyễn Đức Cương – cuongnguyenduc@gmail.com Slide 54
Trả về mã lỗi của lệnh sql vừa thi hành. @@ERROR sẽ trả về giá trị 0 nếu thành công. Ngược lại, nếu lệnh sql thi hành không thành công, nó sẽ trả về một giá trị tương ứng với message lỗi trong bảng sysmessages . a) Sử dụng @@ERROR để phát hiện lỗi VD: USE pubs GO UPDATE authors SET au_id = '172 32 1176‘
I.
STORED PROCEDURES
4. Quản trị sp :
CREATE PROC name WITH RECOMPILE AS sql_statement
• Buộc SQL Server biên dịch lại sp mỗi lần chạy
EXEC procedure_name WITH RECOMPILE
Nguyễn Đức Cương – cuongnguyenduc@gmail.com Slide 55
hay
A. STORED PROCEDURES
Bài tập 1: Viết thủ tục Sp_Update_SP có tham số
Bài tập 2:Viết một thủ tục dùng để lấy về tổng số lượng lập hoá đơn và đơn giá trung bình của của một sản phẩm trong một tháng năm nào đó khi biết mã sản phẩm
Bài tập 3: Viết thủ tục trả về tổng số lượng nhập
dùng để cập nhật dữ liệu mới của một mẫu tin nào đó khi biết Masp trong bảng SanPham
Nguyễn Đức Cương – cuongnguyenduc@gmail.com Slide 56
hoặc xuất của 1 sản phẩm nào đó (dùng @flag để phân biệt trả về số lượng nhập hoặc xuất).
Bài tập 1
create proc Sp_Update_SP @ma int,@giamoi money
as
update Products
set UnitPrice=@giamoi
where ProductID=@ma
--thực thi
Nguyễn Đức Cương – cuongnguyenduc@gmail.com Slide 57
Sp_Update_SP 2,200
Bài tập 2
create proc sp_dgAVG @ma int, @thang int,@nam int as select count(o.orderid) as "tong so luong lap hoa don.", avg(UnitPrice) as "don gia trung binh." from orders o, "Order Details" d where o.orderid=d.orderid and month(OrderDate)=@thang and year(OrderDate)=@nam and ProductID=@ma
Nguyễn Đức Cương – cuongnguyenduc@gmail.com Slide 58
--thực thi: sp_dgAVG 2,7,1997
Bài tập 3
create proc sp_TongSL @ma int, @flag bit as if @flag=0
select sum(Quantity) as "tong so luong nhap:" from orders o, "Order Details" d where o.orderid=d.orderid and ProductID=@ma and ShipVia=1 --Lọai nhập
else
select sum(Quantity) as "tong so luong nhap:" from orders o, "Order Details" d where o.orderid=d.orderid and ProductID=@ma and ShipVia=2 –Loại Xuất
Nguyễn Đức Cương – cuongnguyenduc@gmail.com Slide 59
B.
FUNCTION
–
1. SYSTEM FUNCTION
–
Các hàm định nghĩa sẵn: avg(), count(), count(*), sum(), max(), min(),...
Các function khác : getdate(), month(), upper(), user_name(),@@rowcount,...
–
2. USER-DEFINED FUNCTION
–
Có thể sử dụng biến và cấu trúc điều khiển trong function giống như sp.
–
Function có thể dùng trong lệnh sql, còn sp thì không
Nguyễn Đức Cương – cuongnguyenduc@gmail.com Slide 60
Có thể tạo các function trả về 1 giá trị hoặc trả về 1 table.
B.
FUNCTION
–
SQL Server cho phép tạo 3 loại function :
– Multi-statement Table-valued : Sử dụng nhiều câu lệnh để
Scalar: Trả về một giá trị . Function có thể nhận tới 1024 tham số hay không nhận tham số nào.
–
trả về một tập row.
Quyền :
Inline Table-valued :Sử dụng một câu lệnh Select để trả về một tập row.
Phải có quyền trên lệnh CREATE FUNTION để tạo, sửa , xoá function.
Nguyễn Đức Cương – cuongnguyenduc@gmail.com Slide 61
Phải có quyền EXECUTE để thi hành function.
B.
FUNCTION
3. Tạo scalar function :
Cú pháp :
CREATE FUNCTION [ owner_name. ] function_name
( [ { @parameter_name [AS] scalar_parameter_data_type [ = default ] } --Tham số truyền vào [ ,...n ] ] )
RETURNS scalar_return_data_type - -Kiểu dl của Giá trị trả về
của fun.
[ WITH < function_option> [ [,] ...n] ] [ AS ]
BEGIN
function_body RETURN scalar_expression
Nguyễn Đức Cương – cuongnguyenduc@gmail.com Slide 62
END
B.
FUNCTION
VD :--Tạo function
CREATE FUNCTION dbo.OrderNum ( @monthOrd tinyint ) RETURNS tinyint AS BEGIN
DECLARE @Ordnum tinyint SELECT @Ordnum = count(orderid) FROM Orders WHERE month(orderdate)= @monthOrd RETURN @Ordnum
END GO --Thi hành function .Chú ý : phải dùng tên đầy đủ
SELECT dbo.OrderNum(7) Nguyễn Đức Cương – cuongnguyenduc@gmail.com Slide 63
B. FUNCTION
Có thể dùng function trong mệnh đề Where
Select orderid
from orders
where dbo.OrderNum(7) > 50
Nguyễn Đức Cương – cuongnguyenduc@gmail.com Slide 64
and month(orderdate)=7
B. FUNCTION
Trả về hàm vô hướng – Định nghĩa
CREATE FUNCTION Ham_Soluong_Phong (
@BienMaPhong CHAR (3) )
RETURNS int AS BEGIN
DECLARE @SL int; SELECT @SL = COUNT (*) FROM NhanVien WHERE MaPhong=@BienMaPhong ; RETURN (@SL);
Nguyễn Đức Cương – cuongnguyenduc@gmail.com Slide 65
END
B. FUNCTION
Trả về hàm vô hướng – Sử dụng
SELECT dbo.Ham_Soluong_Phong('KDA');
SELECT MaPhong, count (*)
FROM NhanVien
GROUP BY MaPhong
HAVING count(*) >
Nguyễn Đức Cương – cuongnguyenduc@gmail.com Slide 66
dbo.Ham_Soluong_Phong('QTA')
B. FUNCTION
Ham cho ket qua la mot bang
CREATE FUNCTION Ham_DS_Phong (@BienMaPhong CHAR (3))
RETURNS @kq TABLE (Manv CHAR(5), HoTen
NCHAR(40), NgaySinh DATETIME)
BEGIN
INSERT INTO @kq SELECT Manv, HoTen, NgaySinh FROM NhanVien WHERE MaPhong=@BienMaPhong RETURN
Nguyễn Đức Cương – cuongnguyenduc@gmail.com Slide 67
END
B. FUNCTION
Ham cho ket qua la mot bang
-- Su dung ham tra ket qua bang nhu la TABLE
SELECT *
Nguyễn Đức Cương – cuongnguyenduc@gmail.com Slide 68
FROM Ham_DS_Phong ('QTA')
B. FUNCTION
Ví dụ: Lấy ra các khách hàng có mã khách hàng tùy ý
Nguyễn Đức Cương – cuongnguyenduc@gmail.com Slide 69
create function f_SelectCustomer (@customerid int) returns table as return (select * from customers where customerid > @customerid)
B. FUNCTION
-- Su dung ham tra ket qua bang nhu la TABLE
Nguyễn Đức Cương – cuongnguyenduc@gmail.com Slide 70
SELECT * FROM Ham_DS_Phong ('QTA')
[Categories] [CategoryID] ,[CategoryName]
[Orders] ([OrderID],[CustomerID] ,[EmployeeID]
,[Description] ,[Picture]
[Products][ProductID],[ProductName] ,[SupplierID]
,[OrderDate] ,[RequiredDate] ,[ShippedDate] ,[ShipVia] ,[Freight] ,[ShipName] ,[ShipAddress] ,[ShipCity] ,[ShipRegion] ,[ShipPostalCode] ,[ShipCountry
,[CategoryID] ,[QuantityPerUnit] ,[UnitPrice] ,[UnitsInStock] ,[UnitsOnOrder] ,[ReorderLevel]
Nguyễn Đức Cương – cuongnguyenduc@gmail.com Slide 71
,[Discontinued]
Bài tập
1/ Viết hàm tính độ tuổi trung bình của nhân viên
2/ Viết thủ tục hiển thị danh mục chi tiết các hóa
thuộc 1 thành phố.
3/ Viết thủ tục thêm vào 1 hóa đơn (OrderId,
đơn (Mã hóa đơn, ngày lập, tổng tiền) được lập bởi 1 nhân viên đến từ 1 thành phố nào đó.
Nguyễn Đức Cương – cuongnguyenduc@gmail.com Slide 72
Orderdate, CustomerID, EmpID) và chi tiết hóa đơn (OrderId, productId, Price, quanlity) đó