1. Trang chủ
  2. » Công Nghệ Thông Tin

Tài liệu Các hàm UDFs trong SQL Server docx

5 846 2
Tài liệu đã được kiểm tra trùng lặp

Đang tải... (xem toàn văn)

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Tiêu đề Các hàm UDFs trong SQL Server
Định dạng
Số trang 5
Dung lượng 159,03 KB

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Nội dung

Chúng được gọi thực hiện bằng T-SQL hoặc gọi từ ứng dụng Bài viết này nhằm giới thiệu một kiến thức căn bản về các UDFs trong SQL Server Phiên bản cài đặt MS SQL Server 2005 Cơ sở dữ liệ

Trang 1

Các hàm UDFs trong SQL Server

Nguồn : forum.t3h.vn

Hàm do người dùng định nghĩa (User Defined Function)

Đối với người lập trình (lập trình cơ sở dữ liệu cũng không phải là ngoại lệ) thì công việc viết các thủ tục hàm là rất cần thiết

Các thủ tục nội tại (stored procedure) và các hàm của người dùng (UDFs) được lưu trong các database trên server Chúng được gọi thực hiện bằng T-SQL hoặc gọi từ ứng dụng Bài viết này nhằm giới thiệu một kiến thức căn bản về các UDFs trong SQL Server Phiên bản cài đặt MS SQL Server 2005

Cơ sở dữ liệu AdventureWorks

Kể từ phiên bản SQL Server 2000 trở đi, người lập trình với ngôn ngữ T-SQL được phép tạo ra các Hàm của chính mình để sử dụng

Có ba loại UDF:

• Hàm đơn trị (scalar Function)

• Hàm đọc bảng (inline Table)

• Hàm tạo bảng (multi statement Table)

Hàm đơn trị:

Hàm trả về đúng một giá trị, giá trị trả về có thể là kiểu chuỗi, số, ngày giờ, …

Sử dụng cú pháp sau để tạo hàm:

CREATE FUNCTION Tên Hàm (Danh sách tham số)

RETURNS Kiểu trả về

BEGIN

Khai báo các biến cục bộ

Các lệnh xử lý, tính toán

Trả về giá trị

RETURN Giá trị trả về

END

Ví dụ: tạo hàm đơn trị fnTong2So nhận vào hai số nguyên và trả ra số tổng

CREATE FUNCTION fnTong2So(@a INT,@b INT)

RETURNS INT

BEGIN

Khai báo các biến cục bộ

DECLARE @s INT

Các lệnh xử lý, tính toán

SET @s = @a+@b

Trả về giá trị

RETURN @s

Trang 2

END

Gọi thực hiện

PRINT dbo.fnTong2So(25,18)

Lưu ý:

Hàm tạo mặc định trong schema dbo nên khi gọi phải có dbo.fnTong2So(25,18)

Xóa hàm fnTong2So

DROP FUNCTION fnTong2So

Ví dụ: tạo hàm đơn trị fnThamNien nhận vào một ngày vào làm và trả ra số năm làm

việc

CREATE FUNCTION fnThamNien(@ngay_vao_lam DATETIME)

RETURNS INT

BEGIN

Khai báo các biến cục bộ

DECLARE @so_nam INT

Các lệnh xử lý, tính toán

SET @so_nam = YEAR(GETDATE())-YEAR(@ngay_vao_lam)

Trả về giá trị

RETURN @so_nam

END

Gọi thực hiện

PRINT dbo.fnThamNien('1/27/1989')

Gọi thực hiện

SELECT EmployeeID, LoginID, dbo.fnThamNien(HireDate)

FROM HumanResources.Employee

Ví dụ: tạo hàm đơn trị để lấy dữ liệu

Trong hai ví dụ đầu chỉ mang tính cách minh họa cho việc tạo hàm đơn trị

Tiếp theo giả sử chúng ta cần liệt kê các nhân viên trong bảng

HumanResources.Employee, thông tin liệt kê bao gồm EmployeeID, FirstName,

LastName Nhưng các cột FirstName và LastName chỉ có trong bảng Person.Contact, có nhiều cách để giải quyết nhưng sau đây là cách giải quyết bằng hàm đơn trị:

SELECT EmployeeID, dbo.fnGetName(ContactID) Name

FROM HumanResources.Employee

Hàm fnGetName nhận vào một Contact ID và trả ra chuỗi FirstName, LastName

Hàm đơn trị

CREATE FUNCTION fnGetName(@ContactID INT)

RETURNS VARCHAR(100)

BEGIN

Khai báo các biến cục bộ

DECLARE @name VARCHAR(100)

Các lệnh xử lý, tính toán

SELECT @name=FirstName+', '+LastName

FROM Person.Contact

WHERE ContactID=@ContactID

Trả về giá trị

RETURN @name

END

Trang 3

Gọi thực hiện

SELECT EmployeeID,dbo.fnGetName(ContactID) Name

FROM HumanResources.Employee

Hàm đọc bảng:

Hàm trả về một bảng (table) là kết quả của câu lệnh SELECT

Do trong hàm chỉ có đúng một câu SELECT nên được gọi là inline table Function Hàm đọc bảng được xem như View có tham số

Sử dụng cú pháp sau để tạo hàm:

CREATE FUNCTION Tên Hàm (Danh sách tham số)

RETURNS TABLE

AS

RETURN (Câu lệnh SELECT)

Ví dụ: tạo hàm đọc bảng fnLietKeNV nhận vào mã người quản lý và trả về bảng chứa

các nhân viên của người quản lý đó

Hàm đọc bảng

CREATE FUNCTION fnLietKeNV(@ManagerID INT)

RETURNS TABLE

AS

RETURN (SELECT EmployeeID,LoginID

FROM HumanResources.Employee

WHERE ManagerID=@ManagerID)

GO

Gọi thực hiện để xem các nhân viên của người quản lý có mã 21

Gọi thực hiện để xem các nhân viên của người quản lý có mã 185

Ví dụ: sửa lại hàm đọc bảng fnLietKeNV

Giả sử thông tin đọc được muốn có thêm cột FirstName và LastName thì chúng ta phải sửa lại câu lệnh SELECT trong hàm

Có thể làm như sau:

Sử dụng lại hàm đơn trị fnGetName trong ví dụ trước Hàm fnGetName nhận vào một Contact ID và trả ra chuỗi FirstName, LastName

Hàm fnLietKeNV được sửa lại như sau:

Sủa lại

ALTER FUNCTION fnLietKeNV(@ManagerID INT)

RETURNS TABLE

AS

RETURN (SELECT EmployeeID,LoginID,dbo.fnGetName(ContactID) Name

FROM HumanResources.Employee

WHERE ManagerID=@ManagerID)

GO

Gọi thực hiện để xem các nhân viên của người quản lý có mã 185

SELECT * FROM dbo.fnLietKeNV(185)

Hàm tạo bảng:

Hàm trả về một bảng (table), bảng phải được định nghĩa cấu trúc trong Hàm

Do trong hàm có nhiều câu lệnh nên được gọi là multi statement Function

Trang 4

Sử dụng hàm tạo bảng để tự tạo ra một cấu trúc cho bảng, tạo dữ liệu cho bảng và trả về bảng đã tạo

Sử dụng cú pháp sau để tạo hàm:

CREATE FUNCTION Tên Hàm (Danh sách tham số)

RETURNS @Tên bảng TABLE(Tên cột Kiểu dữ liệu, …)

AS

BEGIN

Tạo dữ liệu ban đầu cho bảng

` Cập nhật dữ liệu (nếu muốn)

Kết thúc

RETURN

END

Ví dụ: tạo hàm tạo bảng fnLietKeTenNV nhận vào 1 hoặc 0 và trả về các nhân viên theo

các yêu cầu sau:

Nếu nhận vào 0 thì các nhân viên trả về gồm có EmployeeID, FirstName

Nếu nhận vào 1 thì các nhân viên trả về gồm có EmployeeID, FirstName và LastName Hàm tạo bảng

CREATE FUNCTION fnLietKeTenNV(@ten_day_du INT)

RETURNS @bang TABLE(manv INT, ten NVARCHAR(100))

AS

BEGIN

Tao du lieu ban dau cho bang

IF @ten_day_du=1

INSERT INTO @bang(manv,ten)

SELECT EmployeeID,FirstName+', '+LastName

FROM HumanResources.Employee e INNER JOIN Person.Contact c

ON e.ContactID=c.ContactID

ELSE

INSERT INTO @bang(manv,ten)

SELECT EmployeeID,FirstName

FROM HumanResources.Employee e INNER JOIN Person.Contact c

ON e.ContactID=c.ContactID

Ket thuc

RETURN

END

Gọi thực hiện để liệt kê FisrtName và LastName

SELECT * FROM dbo.fnLietKeTenNV(1)

Gọi thực hiện để liệt kê chỉ FisrtName

SELECT * FROM dbo.fnLietKeTenNV(0)

Ví dụ: sửa lại hàm tạo bảng fnLietKeTenNV để hiển thị tên chữ HOA

Sửa hàm

ALTER FUNCTION fnLietKeTenNV(@ten_day_du INT)

RETURNS @bang TABLE(manv INT, ten NVARCHAR(100))

AS

BEGIN

Tao du lieu ban dau cho bang

Trang 5

IF @ten_day_du=1

INSERT INTO @bang(manv,ten)

SELECT EmployeeID,FirstName+', '+LastName

FROM HumanResources.Employee e INNER JOIN Person.Contact c

ON e.ContactID=c.ContactID

ELSE

INSERT INTO @bang(manv,ten)

SELECT EmployeeID,FirstName

FROM HumanResources.Employee e INNER JOIN Person.Contact c

ON e.ContactID=c.ContactID

Cap nhat du lieu sang chu HOA

UPDATE @bang

SET ten=UPPER(ten)

Ket thuc

RETURN

END

Gọi thực hiện để liệt kê FisrtName và LastName

SELECT * FROM dbo.fnLietKeTenNV(1)

Ngày đăng: 22/12/2013, 00:16

TỪ KHÓA LIÊN QUAN

w