Ữ Ậ

Ị Ơ Ở Ữ Ệ

NGÔN NG  L P TRÌNH TRONG H  QU N TR  C  S  D  LI U SQL SERVER 2012

ữ ậ Ngôn ng  l p trình

• Ki u d  li u

– Char, VarChar, Nchar, NvarChar

– Bit, TinyInt, SmallInt, Int, BigInt

– Float, SmallMoney, Money, Real

– DateTime

– Text, Image, XML

• Toán tử :  + ­ * / %

ể ữ ệ

ữ ậ Ngôn ng  l p trình

• Cú pháp khai báo

declare @tên_biến kiểu_dữ_liệu [,…

n]

• Gán giá tr  ị

set @tên_biến =

giá_trị | biểu_thức | @biến | hàm

ố ệ

• Kh i l nh

khối_lệnh := begin

lệnh … | khối_lệnh

end

declare @x int, @y int

set @y = 5

set @x = @y + 3

ữ ậ Ngôn ng  l p trình

• C u trúc l nh IF

if (điều_kiện)

lệnh …. | khối_lệnh

else

lệnh …. | khối_lệnh

ệ ấ

ấ ệ • C u trúc l nh WHILE

while (điều_kiện)

lệnh | khối_lệnh

ệ ặ ắ • L nh ng t vòng l p

break

continue

ữ ậ Ngôn ng  l p trình (Cursor)

• Bi n Cursor

declare tên_biến_cursor cursor

for câu_truy_vấn

ế

open tên_biến_cursor

….

close tên_biến_cursor

ử ụ • S  d ng

• H y cursor

deallocate tên_biến_cursor

ữ ậ Ngôn ng  l p trình (Cursor)

fetch định_vị

from tên_biến_cursor

into @tên_biến [,… n]

ể • Di chuy n Cursor

định_vị := next | prior | last | first |

absolute (giá_trị | biến) |

relative (giá_trị | biến)

• Tr ng thái Cursor

@@fetch_status

ữ ệ ế ế ầ =0  : Đang trong dòng d  li u (l n đi k  ti p thành công)

ữ ệ ế ế ầ ≠0 : Ngoài dòng d  li u (l n đi k  ti p không thành công)

ữ ậ Ngôn ng  l p trình (ví d )ụ

Declare @t int, @x int

Set @t = 0 ; Set @x = 1

While (@x <= 100)

begin

if ((@x % 2) = 0)

set @t = @t + @x

set @x = @x + 1

end

Print @t

ố ẳ ừ ổ Tính t ng s  ch n t 1 ­> 100

ữ ậ Ngôn ng  l p trình (ví d )ụ

Declare sv cursor for select * from sinhvien

Open sv

Declare @ma char(5),@ten char(10)

Fetch next from sv into @ma,@ten

While (@@fetch_status = 0)

begin

print @ma + ‘ : ‘ + @ten

Fetch next from sv into @ma,@ten

end

Close sv; Deallocate sv

In các sinhvien(masv char(5),tensv char(10))

Th  t củ ụ (Procedure)  là một chương trình trong cơ sở dữ liệu gồm nhiều câu lệnh mà bạn lưu lại

ạ ậ

cho những lần sử dụng sau. Trong SQL Server, bạn có thể truyền các tham số vào procedure, tuy nó không trả về một giá trị cụ thể như function (hàm) nhưng cho biết việc thực thi thành công hay thất bại. ủ ụ T o l p th  t c

create procedure tên_thủ_tục

@tên_tham_số kiểu_dữ_liệu loại [,…n]

as

lệnh | khối_lệnh

loại := input (không cần ghi)|

output

ủ ụ Th c thi th  t c

exec tên_thủ_tục giá_trị|@biến [output] [,…n]

ủ ụ

Xóa th  t c

Drop procedure tên_thủ_tục

ổ ủ ụ

Thay đ i th  t c

Alter procedure tên_thủ_tục

Th  t củ ụ (ví d )ụ

ế

ủ ụ

Vi

ố t th  t c xóa các sinh viên theo thành ph

sinhvien (masv char(5), tp char(5))

create procedure xoasinhvien

@tp char(5)

as

begin

delete from sinhvien where tp = @tp

end

exec xoasinhvien ‘HCM’

Th  t củ ụ (ví d )ụ

ế

ủ ụ ế

Vi

t th  t c đ m xem có bao nhiêu sinh viên theo thành ph

create procedure dem @tp char(5), @t int output

as

begin

select @t = count(*) from sinhvien

where tp = @tp

end

declare @tong int

exec dem ‘HCM’ , @tong output

print @tong

Hàm (Function)

ạ ậ

T o l p hàm

create function tên_hàm

( @tên_tham_số kiểu [,…n] ) returns kiểu_trả_về

as

lệnh | khối_lệnh

Th c thi hàm

= tên_hàm (giá_trị | @biến [,…n] )

Xóa hàm

Drop function tên_hàm

Thay đ i hàmổ

Alter function tên_hàm

Hàm (ví d )ụ

create function dem (@tp char(5)) returns int

as

begin

declare @t int

select @t = count(*) from sinhvien

where tp = @tp

return @t

end

declare @tong int

set @tong = dbo.dem(‘HCM’)

ế ế Vi ố t hàm đ m xem có bao nhiêu sinh viên theo thành ph .

Hàm (ví d )ụ

ự ộ

t hàm sinh ra mã sinh viên t

ắ  đ ng theo quy t c: mã sinh viên có  ); 0001 : là  i sinh viên có mã cao nh t là  BA0024,

ế Vi ạ d ng: BA0001. Trong đó ‘BA’ : quy đ nh (luôn có 2 ký t ấ ệ ạ ố ố ồ s  g m 4 ký s . VD: Hi n t ớ thì sinh mã m i là BA0025.

Create function sinhkhoa () returns char(6) As

Begin

declare @max int

select

@max = max(cast(substring(masv,3,4) as int)) + 1

from sinhvien

declare @s char(8), @s1 char(6)

set @s = ‘0000’ + cast(@max as char(4))

set @s1 = ‘BA’ + right(rtrim(@s),4)

return @s1

end

Hàm ụ (ví d  table function)

create function laydssv (@malop char(5))

returns TABLE

as

return (

select masv,tensv from sinhvien

where malop = @malop

)

select * from laydssv('QT1')

Hàm ụ (ví d  table function)

create function laydssv1 (@malop char(5))

returns @btam table(masv char(5),tensv char(20))

as

begin

insert into @btam

select masv,tensv from sinhvien

where malop = @malop

return

end

select * from laydssv1('QT1')

ẫ ự ệ B y s  ki n (Trigger)

c phát sinh sau nh ng hành vi thêm m i hay

ẫ ệ • B y l nh đ ổ

ượ thay đ i, xóa trên b ng.

ể ủ

ữ ệ ậ – Có th  h y các c p nh p trên d  li u

ượ

ế ữ

c phát sinh đ  thay th  nh ng hành vi thêm,

ẫ ệ • B y l nh đ ổ đ i, xóa.

ị ớ ượ ư

ẫ ự ệ ư • B y s  ki n l u gi

c đ a vào và

ượ

ị giá tr  cũ đ

tách r i giá tr  m i đ ỏ c xóa b .

– Dùng b ng t m Inserted và deleted

ẫ ự ệ

• B y s  ki n còn áp d ng cho

Login.

ẫ ự ệ

B y s  ki n (trigger)

Lo i trigger FOR

Insert | Update | Delete

Điểm lưu (lưu thể hiện dữ liệu tại thời điểm hiện tại)

Lưu vào dữ liệu

Deleted

Inserte d

Lệnh bẫy sự kiện

Không chấp nhận sự thay đổi (RollBack)

Chấp nhận (Commit)

Kết thúc

18

ẫ ự ệ

B y s  ki n (trigger)

Lo i trigger INSTEAD OF

Insert | Update | Delete

K h ô n g

t

h a y

đ ổ

i

d ữ

l i

ệ u

Deleted

Inserte d

Lệnh bẫy sự kiện

Kết thúc

19

ẫ ự ệ B y s  ki n (Trigger)

ả ạ ẫ ự ệ   B ng t m cho b y s  ki n

ắ ượ ư ữ ệ ư ữ inserted: L u nh ng thông tin s p đ c đ a vào d  li u

ị ượ ữ ư ẩ ế deleted:  L u nh ng thông tin đã có và chu n b  đ c thay th

ặ ự ệ ả ả ấ ạ ố B ng t m có c u trúc gi ng b ng đ t s  ki n.

VD:

ậ ậ ố ớ C p nh p sinh viên mã ‘BA0002’ v i thành ph  ‘HCM’ thành

‘HN’

ả ộ => Vào b ng inserted là b  (‘BA0002’,’aaa’,’HN’)

ả ộ => Vào b ng deleted là b   (‘BA0002’,’aaa’,’HCM’)

ẫ ự ệ B y s  ki n (Trigger)

ộ ữ ệ ể ể ộ ị Các hàm dùng đ  ki m tra c t d  li u b  tác đ ng:

update(tên_c tộ ) :

ả ề ế ế ộ ị ậ ả ậ Tr  v  k t qu  True / False n u c t đó b  c p nh p.

columns_updated() :

ả ề ộ ố ộ ượ ậ ậ ị Tr  v  m t s  xác đ nh các c t đ c c p nh p.

Ví d : ụ Bang (c1,c2,c3,c4)

ế ượ ậ ậ ế ả N u c2 đ c c p nh t => 0010: k t qu  hàm là 2

ế ượ ậ ậ ế ả N u c1,c3,c4 đ c c p nh t => 1101: k t qu  hàm là 13

ẫ ự ệ B y s  ki n (Trigger)

alter database tendatabase

set recursive_triggers { on | off }

ầ ữ

(Update T1, kích ch y ạ Trigger 1. Trigger 1 ch y ạ update T1 l n n a, kích

ch y ạ Trigger 1…)

ự ế ố ổ ệ Thay đ i thông s  cho phép đ  quy tr c ti p

exec sp_configure ‘Nested Triggers’ n

(Update T1, kích ch y ạ Trigger 1. Trigger 1 ch y ạ update T2, kích ch y ạ

Trigger 2. Trigger 2 ch y ạ update T1, kích ch y ạ Trigger 1. …)

ượ ố

L ng nhau đ

c t

i đa là 32 c p đ .

ế ậ ớ ạ ồ ế ệ Thi t l p gi i h n l ng nhau (đ  quy gián ti p)

ẫ ự ệ B y s  ki n (Trigger)

create trigger tên_trigger

on

tên_bảng

{for|instead of} {insert|delete|update}

as

lệnh | khối_lệnh

ạ T o trigger

Xóa và thay đ iổ

{Alter | Drop} trigger tên_trigger

ẫ ự ệ B y s  ki n (ví d )ụ

ườ

ả T o trigger cho b ng sinhvien (masv, tensv, malop) th a  ộ ớ mãn đi u ki n m t l p không quá 20 ng

i.

Create trigger tssv on sinhvien for insert,update

As

Begin

declare @malop char(5), @ts int

select @malop = malop from inserted

select @ts = count(*) from sinhvien

where malop=@malop

if (@ts > 20)

rollback transaction

end

ẫ ự ệ B y s  ki n (ví d )ụ

ạ ỏ ạ

T o trigger cho b ng sinhvien (masv, tensv, trangthai)  ổ th a mãn đi u ki n khi xóa m t sinh viên t c thay đ i  tr ng thái t

ả ề ệ ừ  0 thành 1

Create trigger tssv on sinhvien instead of delete

As

Begin

update sinhvien set trangthai = 1

where

masv in (select masv from deleted)

end