1. Trang chủ
  2. » Giáo án - Bài giảng

Bài 9 hàm người dùng định nghĩa

23 468 0
Tài liệu đã được kiểm tra trùng lặp

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

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 23
Dung lượng 174 KB

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

Nội dung

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 1

Bà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 2

Hàm trả về giá trị đơn - Scalar Functions

CREATE FUNCTION [ schema_name ] function_name

Trang 3

Hà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 5

Hàm UDF trả về bảngInline Table-valued Functions

CREATE FUNCTION [ schema_name ] function_name

Trang 6

select * 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 7

Hàm trả về bảng

Multistatement Table-valued Functions

CREATE FUNCTION [ schema_name ] function_name

Trang 8

EXECUTE_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 9

Ví 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 10

Xá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 11

Xá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 12

Bà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 13

Tạ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 14

Mã 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 15

Mã 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 16

Tạ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 17

Hiể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 18

Hiể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 21

Bà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 22

Bà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 23

Giớ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

Ngày đăng: 16/06/2014, 13:47

TỪ KHÓA LIÊN QUAN

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN