Professional Documents
Culture Documents
1
Nội dung
2
Hàm và thủ tục trong SQL Server
3
Hàm và thủ tục trong SQL Server
2. Các loại hàm
Hàm hệ thống (build-in)
Được viết sẵn dành cho SQL Server
Hàm do người dùng tự định nghĩa (user-
defined):
Người dùng tự xây dựng theo nhu cầu
Dùng lệnh return để trả kết quả
SQL Server hỗ trợ các kiểu trả về từ hàm: giá
trị hoặc bảng dữ liệu
4
Hàm và thủ tục trong SQL Server
Chú ý
Hàm người dùng tự định nghĩa không trả về các
kiểu:
ntext
text
Image
Cursor
Timestamp
Có thể cung cấp thông tin về lỗi nếu phát hiện 5
Hàm và thủ tục trong SQL Server
Hàm hệ thống
Hàm toán học:
abs(numeric),
sqrt(float),
PI(),
ceiling(numeric),
floor(numeric), …
6
Hàm và thủ tục trong SQL Server
Hàm hệ thống
Hàm về thời gian:
getdate(),
year(date),
month(date),
day(date),
datediff(datepart, begindate, enddate),
dateadd(datepart, number, date), …
7
Hàm và thủ tục trong SQL Server
Hàm hệ thống
Hàm về thời gian:
8
Hàm và thủ tục trong SQL Server
Hàm hệ thống
Hàm về thời gian:
select convert(varchar(10),getdate(), 105)
Kết quả: 28-03-2012
select convert(varchar(10),getdate(), 103)
Kết quả: 28/03/2012
select convert(varchar(10),getdate(), 101)
Kết quả: 03/28/2012
9
Hàm và thủ tục trong SQL Server
Hàm hệ thống
Hàm xử lý chuỗi:
substring(expression, start, end),
len(expression),
replace(expression, find_exp, rep_exp),
nchar(integer),
charindex(find_exp, expression_string),
rtrim(expression_string),
ltrim(expression_string), …
10
Hàm và thủ tục trong SQL Server
Hàm hệ thống
Hàm xử lý chuỗi:
select substring(‘abcdef’, 2, 3)
Kết quả: bcd
select nchar(97)
Kết quả: a
select charindex('cd', 'abcdef')
Kết quả: 3
11
Hàm và thủ tục do người dung
định nghĩa
Cú pháp
12
Hàm và thủ tục do người dung
định nghĩa
Ví dụ:
1. Hàm trả về một giá trị: tính tổng 2 số nguyên
CREATE FUNCTION Tong (@a int, @b int)
RETURNS int
AS
BEGIN
return @a+@b
END
13
Hàm và thủ tục do người dung
định nghĩa
14
Hàm và thủ tục do người dung
định nghĩa
Ví dụ:
2. Hàm trả về một bảng dữ liệu:
CREATE FUNCTION TableEmp (@IsWorking int)
RETURNS table
AS
return (select *
from EMPLOYEE
where IS_WORKING=@IsWorking)
15
Hàm và thủ tục do người dung
định nghĩa
Gọi hàm TableEmp
select * from dbo.TableEmp(1)
16
Hàm và thủ tục do người dung
định nghĩa
Trong trường hợp cần phải sử dụng đến nhiều câu lệnh
trong phần thân của hàm, ta sử dụng cú pháp như sau
để định nghĩa hàm
CREATE FUNCTION tên_hàm([các_tham_số])
RETURNS @biến_bảng TABLE định_nghĩa_bảng
AS
BEGIN
các_câu_lệnh_trong_thân_hàm
RETURN
END
17
Hàm và thủ tục do người dung
định nghĩa
Chú ý
Cấu trúc của bảng trả về bởi hàm được xác định dựa
vào định nghĩa của bảng trong mệnh đề RETURNS.
Biến @biến_bảng trong mệnh đề RETURNS có phạm
vi sử dụng trong hàm và được sử dụng như là một
tên bảng.
Câu lệnh RETURN trong thân hàm không chỉ định giá
trị trả về.
Giá trị trả về của hàm chính là các dòng dữ liệu trong
bảng có tên là @biến_bảng được định nghĩa trong
mệnh đề RETURNS
18
Hàm và thủ tục do người dung
định nghĩa
Ví dụ
create function THop(@NO_DEP varchar(7))
returns @DEP_EMP table(NO_EMP varchar(7), NO_DEP
varchar(7)) as
begin
if (@NO_DEP='') INSERT INTO @DEP_EMP
select NO_EMP, '1006001' from EMPLOYEE
else INSERT INTO @DEP_EMP
select NO_EMP, NO_DEP from EMPLOYEE d
where d.NO_DEP=@NO_DEP
return
end
19
Hàm và thủ tục do người dung
định nghĩa
Sửa hàm
Cú pháp
20
Hàm và thủ tục do người dung
định nghĩa
Ví dụ: Sửa hàm Tong(@a int, @b int)
ALTER FUNCTION Tong (@a int, @b int, @c int)
RETURNS int
AS
BEGIN
return @a+@b+@c
END
21
Hàm và thủ tục do người dung
định nghĩa
Ví dụ: Sửa hàm TableEmp(@IsWorking int)
ALTER FUNCTION TableEmp (@IsWorking int)
RETURNS table
AS
return (select NO_EMP, NAME_EMP
from EMPLOYEE
where IS_WORKING=@IsWorking)
22
Hàm và thủ tục do người dung
định nghĩa
Xóa hàm
Cú pháp
DROP FUNCTION <Ten_Function>
Ví dụ
DROP FUNCTION Tong
23
Hàm và thủ tục do người dung
định nghĩa
Tính số nhân viên theo phòng
CREATE FUNCTION SoNV (@NO_DEP varchar(7) )
RETURNS INT
BEGIN
DECLARE @So_NV INT
SET @So_NV = (SELECT COUNT(NO_EMP)
FROM NHANVIEN
WHERE NO_DEP = @NO_DEP
AND IS_ACTIVE=1)
RETURN @So_NV
END
24
Hàm và thủ tục do người dung
định nghĩa
Store procedure (SP):
Là một tập các câu lệnh SQL (chương trình) được biên dịch
và lưu trữ sẵn trên SQL Server
SP cho phép
Chứa nhiều câu lệnh, có thể gọi các SP khác
Nhận các tham số đầu vào, đầu ra
Trả về trạng thái thực hiện (thành công hay thất bại) và
nguyên nhân
Một số loại SP
System stored procedure: SP hệ thống, có tên bắt đầu bằng
sp_
User defined stored procedure: SP do người dùng định nghĩa
Temporary stored procedure: SP tạm thời, bắt đầu bằng # 25
Hàm và thủ tục do người dung
định nghĩa
Quá trình tạo SP
- Phân tích cú pháp:
Nếu có lỗi cú pháp thì thông báo lỗi và không tạo SP
Ngược lại tạo SP, tên SP lưu ở sysobjects, văn bản lệnh lưu ở
syscomments
Thi hành SP (lần đầu hoặc biên dịch lại)
- Đọc văn bản lệnh ở syscomments
- Phân giải tên: liên kết các đối tượng mà SP tham khảo đến
- Tối ưu hóa: tạo kế hoạch thi hành nhanh nhất dựa vào trạng
thái của CSDL và cấu trúc câu lệnh
- Biên dịch: tạo mã thi hành cho kế hoạch đã được tối ưu hóa
và đặt trong vùng procedure cache
- Thi hành SP
26
Hàm và thủ tục do người dung
định nghĩa
Ưu điểm khi sử dụng SP
- Cho phép các ứng dụng khác nhau dùng chung xử lý, đảm
bảo tính nhất quán trong truy xuất và xử lý dữ liệu
- Nhanh, giảm lưu lượng mạng
27
Hàm và thủ tục do người dung
định nghĩa
Biến cục bộ: là một đối tượng cụ thể lưu giữ một giá trị
dữ liệu đơn của một kiểu xác định.
- Tên của biến cục bộ được bắt đầu bởi ký hiệu @
- Biến cục bộ được khai báo bằng lệnh DECLARE
- Ví dụ
DECLARE @sl int, @dbname nvarchar(128)
- Biến cục bộ không thể có kiểu dữ liệu là text, ntext
hoặc image.
Biến toàn cục (hệ thống): do SQL tạo ra
- Tên bắt đầu bởi ký hiệu @@
- Ví dụ: @@rowcount, @@error
28
Hàm và thủ tục do người dung
định nghĩa
Lệnh IF … ELSE
Cú pháp IF <Bieu_thuc_Logic>
<Cau_lenh_SQL |BEGIN <Khoi_lenh> END >
[ELSE
<Cau_lenh_SQL |BEGIN < Khoi_lenh lệnh> END>]
29
Hàm và thủ tục do người dung
định nghĩa
Lệnh CASE
CASE <Bieu_thuc>
Cú pháp WHEN <Gia_tri_1> THEN <Ket_qua_1>
[WHEN <Gia_tri_2> THEN <Ket_qua_2>]
…
[ELSE <Ket_qua_khac>]
END
Ví dụ SELECT Thu =
CASE datepart(w,getdate())
WHEN 1 THEN 'Chu nhat’ WHEN 2 THEN 'Thu hai'
WHEN 3 THEN 'Thu ba’ WHEN 4 THEN 'Thu tu'
WHEN 5 THEN 'Thu nam’ WHEN 6 THEN 'Thu sau'
WHEN 7 THEN 'Thu bay'
END
30
Hàm và thủ tục do người dung
định nghĩa
Lệnh WHILE
Cú pháp WHILE <Bieu_thuc_Logic>
<Cau_lenh_SQL |BEGIN <Khoi_lenh> END > [BREAK]
<Cau_lenh_SQL |BEGIN <Khoi_lenh> END >[CONTINUE]
<Cau_lenh_SQL |BEGIN <Khoi_lenh> END >
RETURN [Bieu_thuc_nguyen]
- Dùng để thoát khỏi SP
- Ví dụ
RETURN RETURN 0 RETURN (1)
33
Hàm và thủ tục do người dung
định nghĩa
Tạo SP
Sử dụng lệnh CREATE PROCEDURE để tạo SP, SP được
lưu ở DB hiện hành
Nếu trong SP có tạo một bảng tạm, thì bảng tạm chỉ tồn tại
khi thực thi SP, bảng tạm sẽ tự động bị xóa khi thi hành xong
SP (bảng tạm có tên bắt đầu bằng ký hiệu #, ví dụ:
#NHANVIEN)
Trong SP không được chứa các câu lệnh: CREATE
PROCEDURE, CREATE RULE, CREATE VIEW, CREATE
TRIGGER
Để thi hành lệnh CREATE PROCEDURE, người dùng phải là
thành viên của một trong các role: sysadmin, db_owner,
db_ddladmin hoặc được cấp quyền CREATE PROCEDURE
34
Hàm và thủ tục do người dung
định nghĩa
Tạo SP
Cú pháp
35
Hàm và thủ tục do người dung
định nghĩa
Tạo SP
Giải thích
- Ten_Procedure: tên procedure, các SP tạm cục bộ có ký hiệu
# trước tên của SP
- @<Tham_so>: tên tham số của procedure
- <Kieu_du_lieu>: kiểu dữ liệu của tham số
- <Gia_tri_mac_dinh>: giá trị mặc định của tham số
- OUTPUT: cho phép tham số nhận giá trị trả về
- RECOMPILE: nếu có thêm tùy chọn này thì mỗi lần thi hành
SQL Server sẽ biên dịch lại SP và mã của SP không được lưu
vào vùng đệm của thủ tục
- ENCRYPTION: nếu có thêm tùy chọn này thì văn bản lệnh
được mã hóa và lưu trong syscomments
36
Hàm và thủ tục do người dung
định nghĩa
Tạo SP
Ví dụ
CREATE PROC DS_NHANVIEN
AS
SELECT * FROM nhanvien
Để thực thi SP
- Ví dụ
EXEC DS_NHANVIEN
37
Hàm và thủ tục do người dung
định nghĩa
Hiệu chỉnh SP
Cú pháp
Ví dụ
ALTER PROC DS_NHANVIEN
AS
SELECT * FROM nhanvien WHERE PHAI= ‘Nam’
38
Hàm và thủ tục do người dung
định nghĩa
Xóa SP
Cú pháp
DROP PROC [EDURE] <Ten_Procedure>
Ví dụ
39
Hàm và thủ tục do người dung
định nghĩa
Xem thông tin SP
Stored procedure Thông tin
Danh sách các tham số cùng
sp_help <Ten_procedure>
kiểu dữ liệu
Văn bản lệnh của SP trong
sp_helptext <Ten_procedure>
trường hợp không mã hóa
Liệt kê các đối tượng mà SP
sp_depends <Ten_procedure> tham khảo đến và các đối
tượng tham khảo đến SP
Danh sách các SP trong DB
sp_stored_procedures
hiện hành
40
Hàm và thủ tục do người dung
định nghĩa
Ví dụ 1 – có tham số vào, default
Xem danh sách nhân viên theo phòng
CREATE PROC DSNV_THEOPHONG
@Phong int = 1
AS
SELECT * FROM NHANVIEN
WHERE PHG = @Phong
Thực thi SP
- Cách 1:
EXEC DSNV_THEOPHONG 4
- Cách 2:
DECLARE @P int
Set @P = 5
EXEC DSNV_THEOPHONG @P
41
Hàm và thủ tục do người dung
định nghĩa
Ví dụ 2 – có tham số vào, ra
Xóa thân nhân theo MANV
CREATE PROC XOA_THANNHAN_THEOMANV
@MANV nvarchar(20), @SoNVXoa int OUTPUT
AS
DELETE THANNHAN
WHERE MA_NVIEN = @MaNV
SET @SoNVXoa = @@rowcount
Thực thi SP
- DECLARE @SoNVXoa int
- EXEC XOA_THANNHAN_NHANVIEN ‘123’, @SoNVXoa
OUTPUT
- PRINT 'So mau tin bi xoa:' + str(@SoNVXoa,3)
42
Hàm và thủ tục do người dung
định nghĩa
Ví dụ 3 – có recompile , encryption
Tăng lương cho nhân viên theo phòng lên @Tyle lần
43
Hàm và thủ tục do người dung
định nghĩa
Ví dụ 4 – có chặn lỗi
Thêm phòng ban
CREATE PROC THEM_PHONGBAN @TENPHG NVARCHAR(40),
@MAPHG INT, @TRPHG NVARCHAR(20),
@NG_NHANCHUC SMALLDATETIME, @Loi int OUTPUT AS
BEGIN TRY
INSERT PHONGBAN VALUES
(@TENPHG, @MAPHG, @TRPHG, @NG_NHANCHUC)
END TRY
BEGIN CATCH
SET @Loi = @@error
RAISERROR('Loi them du lieu',10,1)
RETURN
END CATCH
SET @Loi = @@error
44
Hàm và thủ tục do người dung
định nghĩa
Datepart: d, w, m, y
DATEADD(datepart, number, date): cộng thêm cho ngày
đang xét một số ứng với datepart
DATEDIFF(datepart, startdate, enddate): trả về số ngày,
tuần, … giữa 2 ngày khác nhau
DATENAME(datepart, date): trả về chuỗi tên của ngày
tháng
DATEPART(datepart, date): trả về giá trị số nguyên ứng
với tham số datepart
45
Trigger
Trigger là một stored procedure đặc biệt được gọi tự
động khi user thao tác trên dữ liệu của một table
Được kết hợp với table: Được định nghĩa trên một table cụ
thể .
Được gọi tự động: Khi có một thao tác cập nhật dữ liệu
trên table (insert, update, hoặc delete) thì trigger của thao
tác tương ứng được tự động thực hiện.
Khác với procedure, trigger không thể được gọi trực tiếp,
không nhận tham số
Là một phần của transaction: những lệnh trong trigger
được xem là một single transaction, có thể được roll back
từ bất kỳ chổ nào trong trigger
46
Trigger
Mục đích sử dụng:
Để thực hiện cascade updates và cascade deletes qua
các table quan hệ trong database
Bảo đảm tính toàn vẹn dữ liệu phức tạp : Thực hiện các
ràng buộc có tham chiếu đến các column trong nhiều
table.
Định nghĩa Custom Error Messages: Dùng trigger để trả
về các chuỗi thông báo trạng thái của một hành động
nào đó.
Bảo trì các dữ liệu chưa được chuẩn hoá.
Các tác vụ khác theo yêu cầu nghiệp vụ.
47
Trigger
Triggers được thực hiện tự động sau khi lệnh INSERT, UPDATE,
hoặc DELETE được thực hiện trên một table mà trigger đó được
định nghĩa. Còn các constraints và INSTEAD OF trigger sẽ được
kiểm tra trước khi lệnh INSERT, UPDATE, hoặc DELETE thực
hiện.
Constraints sẽ được kiểm tra trước trigger.
Một table có thể có nhiều Triggers cho một action. Một trigger có
thể được định nghĩa cho nhiều action.
Khi có nhiều trigger trong một table, thì table owner có thể dùng
procedure hệ thống sp_settriggerorder để chỉ định trigger đầu và
trigger cuối để thực thi. Thứ tự của các trigger còn lại không thể
sắp xếp được.
User phải có quyền để thực hiện tất cả các lệnh mà được định
nghĩa trong Triggers
Table Owners không thể tạo ra các Triggers trên Views hoặc
Temporary Tables nhưng có thể tham chiếu đến view và
temporary. 48
Trigger
Triggers không trả kết quả về.
Triggers có thể điều khiển multi-row actions: một hành động
INSERT, UPDATE, hoặc DELETE gọi một trigger có thể ảnh
hưởng lên nhiều dòng dữ liệu, Ta có thể chọn:
Xử lý tất cả các dòng cùng với nhau trong trường hợp các
dòng ảnh hưởng phải thoả điều kiện của trigger.
Xử lý từng dòng thỏa điều kiện.
Các trigger có thể lồng nhau tới 32 mức.
Để cho phép lồng các triger, chúng ta sử dùng Store Procedure
sp_configure:
Sp_configure ‘nested trigger’,1
Để không cho phép lồng các triger, chúng ta sử dùng Store
Procedure sp_configure:
Sp_configure ‘nested trigger’,0 49
Trigger
Khi có action Insert, table logic inserted sinh ra, có cấu trúc
giống với cấu trúc table được insert, có dữ liệu là record đang
được insert
Khi có action delete, table deleted sinh ra, có cấu trúc giống
với cấu trúc table bị deleted, có dữ liệu là record đang bị xoá
Khi có action update, có 2 table inserted và deleted
50
Trigger
54
Trigger
Những lệnh sau đây không được dùng trong định nghĩa trigger
55
Trigger
Sửa 1 trigger đã có
ALTER TRIGGER trigger_name ON table
[WITH ENCRYPTION]
{{FOR {[,] [DELETE] [,] [UPDATE] [,][INSERT]}
AS
sql_statement [...n] }
| {FOR {[,] [INSERT] [,] [UPDATE]}
AS
IF UPDATE (column)
[{AND | OR} UPDATE (column) [,...n]]
sql_statement [...n] }
}
56
Trigger
Xoá trigger
DROP TRIGGER trigger_name
57