Hàm trả về giá trị vô hướngCREATE TABLE [dbo].[tmpHoaDon] [Ngay_hd] [datetime] NULL, [KhachHang] [nvarchar]50 NULL, [Ma_hd] [nvarchar]50 NULL, [GhiChu] [nvarchar]100 NULL ON [PRIMARY] -
Trang 1Bài 9: Hàm người dùng định nghĩa
- Hàm trả về giá trị đơn - Scalar Functions
- Hàm UDF trả về bảng:
– Inline Table-valued Functions
– Multistatement Table-valued Functions
Trang 2Hàm trả về giá trị đơn - Scalar Functions
CREATE FUNCTION [ schema_name ] function_name
Trang 3Hàm trả về giá trị vô hướng
CREATE TABLE [dbo].[tmpHoaDon]( [Ngay_hd] [datetime] NULL,
[KhachHang] [nvarchar](50) NULL, [Ma_hd] [nvarchar](50) NULL,
[GhiChu] [nvarchar](100) NULL ) ON [PRIMARY]
- Ta thấy dữ liệu trong Ngay_HD gồm có cả ngày tháng năm và giờ phút giây
Select Ngay_hd, KhachHang from tmpHoaDon where Ngay_HD=getDate() order by
Ngay_HD
-Sẽ không được bản ghi nào vì có so sánh cả giớ phút giây
Xuất phát từ lý do này ta tạo thủ tục ngày tháng năm
Use KhoHang CAST and CONVERT trong BOL
• Create Function dbo.GetDay (@Date datetime)
- Lệnh sau đây sẽ cho các hóa đơn trong ngày hiện thời:
Select Ngay_hd, KhachHang from tmpHoaDon where
Trang 5Hàm UDF trả về bảngInline Table-valued Functions
CREATE FUNCTION [ schema_name ] function_name
Trang 6select * from dbo.danhSachHoadon(@d)
Như vậy ta thấy có thể sử dụng hàm giống như view, tuy nhiên ta có thể sử dụng các tham số của hàm để cho view linh họat hơn
Trang 7Hàm trả về bảng
Multistatement Table-valued Functions
CREATE FUNCTION [ schema_name ] function_name
Trang 8EXECUTE_AS_Clause – Sử dụng giống như trong thủ tục.
(Tự thực hành hàm với các tham số EXECUTE_AS Caller,…)
Trang 9Ví dụ
Use test
CREATE TABLE dbo.employees (empid nchar(5) PRIMARY KEY, empname nvarchar(50), mgrid nchar(5) NULL REFERENCES
employees(empid), title nvarchar(30) )
Viết hàm fn_FindReports xác định (hiển thị) tất cả các nhân viên thuộc quyền quản lý của @InputEmpID
CREATE FUNCTION dbo.fn_FindReports
( @InputEmpId nchar(5) ) RETURNS @retFindReports TABLE
(empid nchar(5) primary key, empname nvarchar(50) NOT NULL,
mgrid nchar(5), title nvarchar(30))
Trang 10Xác định đường dẫn đầy đủ của thư mục
create table Directory (ID int identity, FolderName varchar(128),
Parent_ID int)
CREATE FUNCTION dbo.Path (@ID int)
RETURNS varchar(1000) AS
BEGIN
if @ID is null return ''
declare @s varchar(1000), @Parent_ID int
select @s=FolderName, @Parent_ID=Parent_ID
from Directory where ID=@ID
return dbo.Path(@Parent_ID)+@s+'/'
END
declare @st varchar(40)
Trang 11Xác định đường dẫn đầy đủ của thư mục (2)
CREATE FUNCTION dbo.Path_while (@ID int)
RETURNS varchar(8000) AS
BEGIN
declare @s varchar(8000), @Parent_ID int
select @s=FolderName, @Parent_ID=Parent_ID from Directory where
ID=@ID
while @Parent_ID is not null begin
select @s=FolderName+'/'+@s, @Parent_ID=Parent_ID from Directory where ID=@Parent_ID
Trang 12Bài tập
- Sua bang Directory: them truong Path
- Them Trigger (For Insert, Update): Tự động cap nhat du lieu cho truong Path
- Giả sử có bảng: Department(Dep_ID, Dep_name, Sup_ID)
- Viết hàm xác định danh sách các phòng ban thuộc quyền quản lý của Input_DepID
- Xác định các phòng ban cấp trên của Input_DepID
Trang 13Tạo hàm đảo ngược chuỗi
Alter Function dbo.fn_DaonguocHoDemTen(@InputSt nvarchar(255))
returns nvarchar(255) as
Begin declare @Ho nvarchar(30), @Temp nvarchar(255), @vt int
set @InputSt=Rtrim(Ltrim(@InputSt))
set @vt = charindex(' ',@InputSt); set @Ho = '‘
Cat lay phan Ho
if @vt>0 set @Ho =Left(@InputSt, @vt-1) set @InputSt = LTrim(Right(@InputSt, Len(@InputSt) - @vt))
set @vt = charindex(' ',@InputSt) Vi tri cua dau cach cuoi cung
declare @vtcuoi int, @Dem nvarchar(30);
set @vtcuoi=0; set @Dem=''
While @vt <> 0
Begin set @vtcuoi=@vt;
set @Dem =@Dem +' '+ Left(@InputSt, @vt-1)
set @InputSt = LTrim(Right(@InputSt, Len(@InputSt) - @vt))
set @vt = charindex(' ',@InputSt)
End
return @InputSt + ' ' + Rtrim(LTrim(@Dem))+' '+ Rtrim(LTrim(@Ho))
End
Trang 14Mã unicode của các ký tự tiếng Việt
use test
go
drop table dbo.BangMaUnicode
go
CREATE TABLE [dbo].BangMaUnicode (
[ID] [int] NULL ,Kitu [nvarchar] (50) COLLATE
Trang 15Mã unicode của các ký tự tiếng Việt (2)
declare @InputSt nvarchar(255)
set @InputSt
=N'AaÀàẢảÃãÁáẠạĂăẰằẲẳẴẵẮắẶặÂâẦầẨẩẪẫẤấẬậBbCcDdĐđEeÈèẺẻẼẽÉéẸẹÊêỀềỂể ỄễẾ'
set @InputSt=
@InputSt+N'ếỆệFfGgHhIiÌìỈỉĨĩÍíỊịJjKkLlMmNnOoÒòỎỏÕõÓóỌọÔôỒồỔổỖỗỐốỘộƠơỜờ ỞởỠỡỚớỢợPp'
set
@InputSt=@InputSt+N'QqRrSsTtUuÙùỦủŨũÚúỤụƯưỪừỬửỮữỨứỰựVvWwXxYyỲỳỶỷ ỸỹÝýỴỵZz'
declare @i int,@dodai int
Trang 16Tạo hàm sắp xếp tiếng Việt
- Kiểm tra với collation Vietnamese_CS_AI
USE [Test] GO
CREATE TABLE [dbo].[TestCollation](ID int,
[Kitu] [nvarchar](1) COLLATE Vietnamese_CS_AI NULL ) ON [PRIMARY]
declare @InputSt nvarchar(255)
set @InputSt =N'AaÀàẢảÃãÁáẠạĂăẰằẲẳẴẵẮắẶặÂâẦầẨẩẪẫẤấẬậBbCcDdĐđEeÈèẺẻẼẽÉéẸẹÊêỀềỂểỄễẾ'
set @InputSt= @InputSt+N'ếỆệFfGgHhIiÌìỈỉĨĩÍíỊịJjKkLlMmNnOoÒòỎỏÕõÓóỌọÔôỒồỔổỖỗỐốỘộƠơỜờỞởỠỡỚớỢợPp' set @InputSt=@InputSt+N'QqRrSsTtUuÙùỦủŨũÚúỤụƯưỪừỬửỮữỨứỰựVvWwXxYyỲỳỶỷỸỹÝýỴỵZz'
declare @i int,@dodai int
Trang 17Hiển thị danh sách tên các sản phẩm
Cho biết một tập hợp các ProductID: '9 12 27 37'
Cần viết một hàm để hiển thị tên của tất cả các sản phẩm này trong
bảng AdventureWorks.Production.Product
VD:
Use AdventureWorks
Get_product_names_iter '9 12 27 37'
Trang 18Hiển thị danh sách tên các sản phẩm (3)
Create PROCEDURE Get_product_names_iter
Trang 19Đầu vào là một xâu gồm các ID sản phẩm cách nhau bởi một dấu cách, giả thiết xâu này có kích thước rât lớn
CREATE FUNCTION iter_intlist_to_table (@list ntext)
RETURNS @tbl TABLE (listpos int IDENTITY(1, 1), number int NOT NULL)
AS BEGIN
Ý tưởng: lấy ra từng đoạn có độ dài khoảng 4000 kí tự
SET @textpos = 1;
WHILE @textpos <= datalength(@list) / 2
SET @chunklen = 4000 – 10 – Giả sử 10 là độ dài lớn nhất của một ID
SET @tmpstr = ltrim(@leftover + substring(@list, @textpos, @chunklen))
SET @textpos = @textpos + @chunklen
SET @pos = charindex(' ', @tmpstr)
Trang 21Bài tập 2
- Cho một file dữ liệu Input.txt gồm các xâu kí tự như trong bài tập 1
- Giả sử có hai bảng: DMSanPham(MaSP, TenSP) và bảng
NhapHangHoa (MaHD, NguoiNhap, GhiChu, MaSP, Soluong,
DonGia)
- Hãy viết thủ tục hoặc hàm phân tích từng xâu kí tự trong file:
- Nếu MaSP chưa có trong DMSanPham(MaSP, TenSP) thì ta
chèn MaSP và TenSP vào bảng này
- Chèn các giá trị MaHD, NguoiNhap, GhiChu, MaSP, SoLuong, DonGia lấy được từ xâu vào bảng NhapHangHoa
Trang 22Bài tập 3
- Cho một file dữ liệu Input.txt như trong bài tập 3
- Giả sử có ba bảng: DMSanPham(MaSP, TenSP), bảng
NhapHangHoa (MaHD, NguoiNhap, GhiChu) và bảng
NhapHangHoaChiTiet (MaHD, MaSP, Soluong,DonGia)
- Hãy viết thủ tục hoặc hàm phân tích từng xâu kí tự trong file:
- Nếu MaSP chưa có trong DMSanPham(MaSP, TenSP) thì ta
chèn MaSP và TenSP vào bảng này
- Nếu MaHD chưa có trong bảng NhapHangHoa thì chèn giá trị MaHD, NguoiNhap, GhiChu vào bảng này
- Chèn các giá trị MaHD,MaSP,SoLuong,DonGia vào bảng
NhapHangHoaChiTiet
Trang 23Giới thiệu ứng dụng App1
• Ứng dụng App1 là một minh họa về mô hình ứng dụng nhiều lớp
• Các xử lý phức tạp của ứng dụng được viết dưới dạng các hàm hoặc thủ tục trên SQL Server
• Minh họa cách triệu gọi các hàm, thủ tục của SQL Server từ phía ứng dụng