際際滷

際際滷Share a Scribd company logo
Ch動董ng 4
L畉p tr狸nh v畛i T-SQL
 K畛 thu畉t thi hnh l畛nh T-SQL
 C叩c c畉u tr炭c i畛u 一鞄庄畛n
 Stored Procedure (th畛 t畛c)
 Function (hm)
2
N畛i dung
C董 b畉n v畛 l畉p tr狸nh b畉ng T_SQL
Khai b叩o v s畛 d畛ng bi畉n
C叩c c畉u tr炭c l畛nh
RaiseError
IDENTIFIER (畛nh danh)
 T棚n c畛a c叩c 畛i t動畛ng 畛u 動畛c g畛i l 畛nh danh.
Trong SQL Server, c坦 c叩c 畛nh danh nh動 Server,
Databases, Object of Database as Table, View, Index,
Constraint,
 Qui t畉c 畛nh danh:
 T畛i a 128 k箪 t畛.
 B畉t 畉u l m畛t k箪 t畛 t畛 A-Z
 B畉t 畉u l m畛t k箪 hi畛u @, # s畉 c坦 m畛t 箪 ngh挑a kh叩c.
 Nh畛ng 畛nh danh no c坦 d畉u kho畉ng tr畉ng 畛 gi畛a th狸
ph畉i k畉p trong d畉u [] ho畉c  
 畉t 畛nh danh sao cho ng畉n g畛n, 畉y 畛 箪 ngh挑a,
ph但n bi畛t gi畛a c叩c 畛i t動畛ng v畛i nhau, kh担ng tr湛ng
l畉p, kh担ng tr湛ng v畛i t畛 kh坦a c畛a T-SQL.
Tham chi畉u 畉n c叩c 畛i t動畛ng trong SQL Server
C炭 ph叩p:
Server.Database.Owner.Object
Hay:
Server.Database..Object
V鱈 d畛:
Create Table Northwind.dbo.Customers
Create Table Northwind..Customers
Data type, Batch, Script
Ki畛u d畛 li畛u (Data type) : c坦 hai lo畉i
 Ki畛u d畛 li畛u h畛 th畛ng: Do h畛 th畛ng cung c畉p
 Ki畛u d畛 li畛u do ng動畛i d湛ng 畛nh ngh挑a (User  defined data
types.)
G坦i l畛nh (Batch)
 Bao g畛m c叩c ph叩t bi畛u T-SQL v k畉t th炭c b畉ng l畛nh GO.
 C叩c l畛nh trong g坦i l畛nh s畉 動畛c bi棚n d畛ch v th畛c thi c湛ng
m畛t l炭c.
 N畉u m畛t l畛nh trong batch b畛 l畛i th狸 batch c滴ng xem nh動 l畛i
 C叩c ph叩t bi畛u Create b畛 rng bu畛c trong m畛t batch 董n.
Ex : Use Northwind
Select * from Customers
GO
K畛ch b畉n (Script )
 M畛t k畛ch b畉n l m畛t t畉p c畛a m畛t hay nhi畛u b坦 l畛nh 動畛c l動u
l畉i thnh m畛t t畉p tin .SQL
Bi畉n  Bi畉n c畛c b畛
 Bi畉n l m畛t 畛i t動畛ng d湛ng 畛 l動u tr畛 d畛 li畛u. Bi畉n
ph畉i 動畛c khai b叩o tr動畛c khi d湛ng.
 C坦 2 lo畉i bi畉n: c畛c b畛 v ton c畛c
 Bi畉n c畛c b畛:
 動畛c khai b叩o trong ph畉n th但n c畛a m畛t b坦 l畛nh hay
m畛t th畛 t畛c.
 Ph畉m vi ho畉t 畛ng c畛a bi畉n b畉t 畉u t畛 i畛m m n坦
動畛c khai b叩o cho 畉n khi k畉t th炭c m畛t b坦 l畛nh,
m畛t th畛 t畛c hay m畛t hm m n坦 動畛c khai b叩o.
 T棚n c畛a bi畉n b畉t 畉u b畉ng @
V鱈 d畛
DECLARE @makh CHAR(5)
SET @makh = 'ANTON'
SELECT * FROM Customers
WHERE Customerid = @makh
S畛 d畛ng bi畉n c畛c b畛
 Khai b叩o
DECLARE @var_name = expression
SELECT {@var_name = expression}[,n]
VD :
DECLARE @manv int
SET @manv = 2
SELECT * FROM Employees
WHERE Employeeid = @manv
DECLARE @manv int, @country nvarchar(15)
SET @manv = 3
SET @country ='Usa'
SELECT * FROM Employees
WHERE Employeeid = @manv
and country =@country
S畛 d畛ng bi畉n c畛c b畛
VD DECLARE @tong int
Select @tong = Sum(quantity * Unitprice) From
[Order details]
SELECT @tong as tongtien
Print 'Tong tien = '+ convert(varchar(20),@tong)
DECLARE @masp int
Select @masp = productid From
Northwind..Products
Select @masp c畛a d嘆ng cu畛i trong b畉ng
DECLARE @Masp int
Select @masp = Productid From Northwind..Products
Order by Productid DESC
Select @masp as 'Ma SP'
S畛 d畛ng bi畉n c畛c b畛
 Bi畉n ton c畛c 動畛c 畛nh ngh挑a nh動 hm h畛 th畛ng. C叩c
bi畉n ny kh担ng c坦 ki畛u.
 T棚n b畉t 畉u b畉ng @@
Bi畉n ton c畛c
Variable Return value
@@Trancount
@@Servername
@@Rowcount
@@Identity
@@Error
@@Fetch_status
Number of transactions currently open on the connection
Name of local servers running SQL Server
Number of rows affected by the latest SQL statement
Return last Number Identity
Return order number Error when SQL exculate, return 0 when The
command completed successfully
Return status of Fetch command of pointer variable
(0 :Success, -1 : Mistake or exceed range, -2 : Unsuccess
C叩c bi畉n ton c畛c
VD:
--How many are transaction opening
If (@@Trancount>0)
Begin
Raiserror ('Take can not be executed within a transaction',10,1)
Return
End
--Number of rows affected by the latest SQL statement
Use Northwind
Update Employees Set LastName ='Brooke' where LastName ='Lan'
If (@@RowCount =0)
Begin
Print 'Warning : No rows were updated'
Return
End
Update Customers Set Phone ='030' + Phone
Where Country = 'German'
Print @@Rowcount
C叩c bi畉n ton c畛c
--Tra ve so Identitity phat sinh sau cung
Create table hd (Mahd int identity Primary key, Ghichu
varchar(20))
Create table cthd(Mahd int,Masp char(10), Soluong int)
Insert into hd Values ('Record 1')
Insert into hd Values ('Record 2')
Declare @maso int
Set @maso = @@identity
Insert into cthd Values (@maso,'sp001',5)
Insert into cthd Values (@maso,'sp002',12)
Select * from hd
Select * from cthd
C叩c bi畉n ton c畛c
C畉u tr炭c i畛u 一鞄庄畛n
 Kh畛i BEGIN...END: N畉u nhi畛u ph叩t bi畛u
c畉n th畛c thi c坦 li棚n quan v畛i nhau th狸 畉t
c叩c ph叩t bi畛u ny trong BeginEnd
C炭 ph叩p:
BEGIN
statement | statement_block
END
 RETURN: Tr畉 v畛 m畛t gi叩 tr畛, l畛nh ny n畉m trong m畛t block
(kh畛i) hay procedure. N畉u g畉p ph叩t bi畛u Return, qu叩 tr狸nh x畛
l箪 k畉t th炭c
C炭 ph叩p
Return [Integer_expression]
C畉u tr炭c i畛u 一鞄庄畛n
 L畛nh PRINT: D湛ng 畛 in th担ng tin ra mn h狸nh k畉t qu畉 c畛a
SQL.
C炭 ph叩p:
PRINT any ASCII text|@local_variable|@@Function
|string_expr
V鱈 d畛:
Print 'Hello'
Print N'Cho b畉n'
Print getdate()
Print @@version
Declare @ten nvarchar(15)
Set @ten ='Nguyen Minh'
Print @ten
C畉u tr炭c i畛u 一鞄庄畛n
 C畉u tr炭c i畛u 一鞄庄畛n IF...ELSE: Cho ph辿p th畛c thi m畛t
hay nhi畛u l畛nh t湛y thu畛c vo m畛t i畛u ki畛n no 坦.
 C炭 ph叩p:
If Condition
statements
[Else [Condition 1]
statements]
 V鱈 d畛 :
If (Select Count(*) From Customers
Where Country ='Germany')>0
print 'Co khach hang o Germany'
Else
print 'Khong co khach hang o Germany'
C畉u tr炭c i畛u 一鞄庄畛n
 V鱈 d畛:
Declare @msg varchar(100)
If (Select Count(Unitprice) From Products
Where QuantityPerunit like '%box%')>0
Begin
Set NOCOUNT ON
Set @msg = 'Co vai sp co don vi tinh co chu box.
Cac sp do la :'
Select @msg
Select ProductName From Products
where QuantityPerunit like '%box%'
End
Else
print 'Khong co sp nao co dvt co chu box'
C畉u tr炭c i畛u 一鞄庄畛n
 V鱈 d畛:
If (Select Avg(Unitprice) From Products
where QuantityPerUnit like '%box%' )>0
Begin
Set NOCOUNT on
Declare @msg nvarchar(30)
Set @msg = 'Co vai sp c坦 don vi tinh co chu box.
Cac sp do la:'
Select @msg
Select ProductName From Products
where QuantityPerUnit like '%box%'
End
Else
print 'Khong co sp nao co dvt co chu box'
C畉u tr炭c i畛u 一鞄庄畛n
 CASE : l m畛t bi畛u th畛c i畛u ki畛n 動畛c 叩p d畛ng b棚n trong m畛t
ph叩t bi畛u kh叩c. Case tr畉 v畛 c叩c gi叩 tr畛 kh叩c nhau t湛y vo i畛u
ki畛n hay m畛t i畛u 一鞄庄畛n no 坦.
 C炭 ph叩p 1 :
Case input_expression
When when_expression Then resulf_expression[n]
[ELSE else_result_expression]
End
 C炭 ph叩p 2 :
Case Boolean_expression
When Boolean_expression Then resulf_expression[n]
[
ELSE else_result_expression
]
End
C畉u tr炭c i畛u 一鞄庄畛n
 Example 1 :
Declare @a int, @b int, @Hieu int
Set @a = 15
Set @b =27
Set @hieu = Case
When @a<@b then @b-@a
When @a>@b then @a-@b
Else 0
End
Print 'Hieu='+convert(varchar(20),@hieu)
Example 2 :
Select ProductName, Unitprice,
'Classification'=CASE
When Unitprice<10 then 'Low price'
When Unitprice Between 10 and 20 then 'Moderately Price'
When Unitprice>20 then 'Expensive'
Else 'Unknown'
END
From Products
C畉u tr炭c i畛u 一鞄庄畛n
Select Productid, Quantity, UnitPrice, [discount%]=
CASE
When Quantity <=5 then 0.05
When Quantity between 6 and 10 then 0.07
When Quantity between 11 and 20 then 0.09
Else 0.1
END
From [Order Details]
Order by Quantity, Productid
C畉u tr炭c i畛u 一鞄庄畛n
 GOTO: chuy畛n th畛c thi ch動董ng tr狸nh 畉n v畛 tr鱈 nh達n (label)
 Example
Declare @a int, @b int, @Hieu int
Set @a = 39
Set @b =10
hieu_loop:
if @a>@b
begin
Set @hieu =@A-@B
print 'a= '+convert(varchar(20),@a)
print 'b= '+convert(varchar(20),@b)
print 'hieu= '+convert(varchar(20),@hieu)
Set @a =@hieu
Goto hieu_loop
end
print 'a='+convert(varchar(20),@a)
print 'b='+convert(varchar(20),@b)
print 'hieu='+convert(varchar(20),@hieu)
C畉u tr炭c i畛u 一鞄庄畛n
 Ph叩t bi畛u l畉p WHILE: V嘆ng l畉p s畉 th畛c thi cho 畉n
khi bi畛u th畛c i畛u ki畛n (Boolean expression) trong
While mang gi叩 tr畛 False.
 C炭 ph叩p 1 :
WHILE Boolean_expression
{sql_statement | statement_block}
[BREAK]
{sql_statement | statement_block}
[CONTINUE]
C畉u tr炭c i畛u 一鞄庄畛n
 Example :
Use Northwind
While (Select Avg(unitprice) From [Order Details]) <$50
Begin
Update [Order Details]
SET Unitprice = Unitprice *2
Select Max(Unitprice) From [Order Details]
If (Select Max(Unitprice) From [Order Details])>$50
BREAK
Else
CONTINUE
End
Print 'Too much for the market to bear'
C畉u tr炭c i畛u 一鞄庄畛n
 WAITFOR: SQL Server t畉m d畛ng m畛t th畛i gian tr動畛c khi x畛 l箪
ti畉p c叩c ph叩t bi畛u sau 坦.
 C炭 ph叩p :
WAITFOR {DELAY time |TIME time}
Time : hh:mm:ss
Deplay time: h畛 th畛ng t畉m d畛ng trong kho畉ng th畛i
gian time
TIME time: h畛 th畛ng t畉m d畛ng trong kho畉ng th畛i gian
time ch畛 ra
V鱈 d畛:
WAITFOR DELAY '00:00:02'
SELECT EmployeeID FROM Northwind.dbo.Employees
C畉u tr炭c i畛u 一鞄庄畛n
 L畛nh RAISERROR: ph叩t sinh l畛i c畛a ng動畛i d湛ng
C炭 ph叩p
RAISERROR ({msg_id | msg_str}{, severity, state}
[WITH option[,...n]]
 Msg_id: L th担ng b叩o, 動畛c l動u trong b畉ng sysmessage.
M達 th担ng b叩o c畛a ng動畛i d湛ng ph畉i b畉t 畉u t畛 tr棚n
50000
 Msg_str: N畛i dung th担ng b叩o, t畛i a 400 k箪 t畛.
 畛 truy畛n tham s畛 vo trong th担ng b叩o th狸 d湛ng d畉ng
%<Lo畉i k箪 t畛>
 Lo畉i k箪 t畛 l d,I,o,x,X hay u
 L動u 箪: s畛 float, double, char kh担ng 動畛c h畛 tr畛
C畉u tr炭c i畛u 一鞄庄畛n
 L畛nh RAISERROR: ph叩t sinh l畛i c畛a ng動畛i d湛ng
C叩c k箪 t畛 M担 t畉
d ho畉c I Bi畛u hi畛n l s畛 nguy棚n (integer)
O Octal kh担ng d畉u
P Con tr畛
S Chu畛i
U S畛 nguy棚n kh担ng d畉u
x or X Hexadecimal kh担ng d畉u
C畉u tr炭c i畛u 一鞄庄畛n
Severity Levels: M畛c l畛i c畛a m畛t th担ng b叩o l畛i cung c畉p m畛t
s畛 bi畛u th畛 lo畉i v畉n 畛 m SQL Server g畉p ph畉i.
 M畛c l畛i 10 l l畛i v畛 th担ng tin v bi畛u th畛 nguy棚n nh但n do
th担ng tin nh畉p vo.
 M畛c l畛i t畛 11 畉n 16 th狸 th担ng th動畛ng l do c叩c user.
 M畛c t畛 17 畉n 25 do l畛i ph畉n m畛m ho畉c ph畉n c畛ng. B畉n
n棚n b叩o cho nh qu畉n tr畛 h畛 th畛ng b畉t c畛 khi no s畛 c畛 x畉y
ra. Nh qu畉 tr畛 h畛 th畛ng ph畉i gi畉i quy畉t s畛 c畛 坦 v theo d探i
ch炭ng th動畛ng xuy棚n. Khi m畛c l畛i 17,18,19 x畉y ra, b畉n c坦
th畛 ti畉p t畛c lm vi畛c, m畉c d湛 b畉n kh担ng th畛 th畛c thi l畛nh
畉c bi畛t.
C畉u tr炭c i畛u 一鞄庄畛n
 M畛c l畛i 17: Nh畛ng th担ng b叩o ny cho bi畉t r畉ng c但u l畛nh
SQL Server c畉n ki畛t ti nguy棚n (V鱈 d畛 nh動 lock ho畉c thi畉u
kh担ng gian 挑a cho CSDL) ho畉c v動畛t qu叩 t畉p gi畛i h畉n b畛i
nh qu畉n tr畛
 Ng動畛i qu畉n tr畛 h畛 th畛ng n棚n gi叩m s叩t t畉t c畉 c叩c s畛 c畛 x畉y ra
c坦 m畛c tr畉m tr畛ng t畛 17 畉n 25 v in ra gi畉i th鱈ch l畛i bao
g畛m c叩c th担ng tin 畛 quay l畉i t畛 l畛i.
 M畛c l畛i t畛 20 畉n 25 ch畛 ra s畛 c畛 h畛 th畛ng. 坦 l l畛i kh担ng
tr叩nh 動畛c, c坦 ngh挑a l ti畉n tr狸nh kh担ng c嘆n ang ch畉y.
Ti畉n tr狸nh t棚 li畛t tr動畛c khi n坦 d畛ng, ghi nh畉n th担ng tin v畛
c叩i g狸 x畉y ra, v sau 坦 k畉t th炭c.
C畉u tr炭c i畛u 一鞄庄畛n
 State: L m畛t s畛 nguy棚n t湛y 箪 t畛 1 畉n 127 m担 t畉 th担ng tin
di畛n gi畉i v畛 tr畉ng th叩i l畛i.
 Argument: L tham s畛 d湛ng trong vi畛c thay th畉 cho bi畉n 畛
畛nh ngh挑a th担ng b叩o l畛i ho畉c th担ng b叩o t動董ng 畛ng v畛i m達
l畛i msg_id. C坦 th畛 kh担ng c坦 ho畉c c坦 nhi畛u tham s畛, tuy
nhi棚n, kh担ng 動畛c qu叩 20. M畛i tham s畛 thay th畉 c坦 th畛 l
m畛t bi畉n local ho畉c m畛t tr畛 b畉t k畛 trong c叩c ki畛u d畛 li畛u int,
char, varchar, binary, varbinary. C叩c ki畛u kh叩c kh担ng 動畛c
cung c畉p.
C畉u tr炭c i畛u 一鞄庄畛n
 Th棚m m畛t th担ng b叩o l畛i m畛i do ng動畛i d湛ng 畛nh ngh挑a
C炭 ph叩p:
Sp_AddMessage msg_id, severity,
msg[,language][,with_log][,replace]
 X坦a m畛t th担ng b叩o l畛i m畛i do ng動畛i d湛ng 畛nh ngh挑a
Sp_DropMessage msg_id
C畉u tr炭c i畛u 一鞄庄畛n
C炭 ph叩p:
 msg_id: l m達 s畛 c畛a l畛i m畛i, l m畛t s畛 int, kh担ng 動畛c
tr湛ng c叩c m達 達 c坦 s畉n, b畉t 畉u l 50001.
 severity: l m畛c nghi棚m tr畛ng c畛a l畛i, l m畛t s畛
smallint. M畛c h畛p l畛 l t畛 1 畉n 25. Ch畛 c坦 ng動畛i qu畉n
tr畛 CSDL m畛i c坦 th畛 ph叩t sinh th棚m m畛t th担ng b叩o l畛i
m畛i t畛 19 畉n 25.
 'msg': l m畛t chu畛i th担ng b叩o l畛i, t畛i a 255 k箪 t畛.
 'language': l ng担n ng畛 c畛a th担ng b叩o l畛i, m畉c 畛nh l
ng担n ng畛 c畛a phi棚n k畉t n畛i.
C畉u tr炭c i畛u 一鞄庄畛n
 'with_log': th担ng b叩o l畛i c坦 動畛c ghi nh畉n vo nh畉t k箪 c畛a
畛ng d畛ng khi n坦 x畉y ra hay kh担ng, m畉c 畛nh l FALSE. N畉u l
true, th狸 l畛i lu担n lu担n 動畛c ghi vo nh畉t k箪 畛ng d畛ng. Ch畛 c坦
nh畛ng thnh vi棚n c坦 vai tr嘆 sysadmin m畛i c坦 th畛 s畛 d畛ng
tham s畛 ny.
 'replace': n畉u 動畛c ch畛 畛nh chu畛i REPLACE, th狸 th担ng b叩o
l畛i 達 t畛n t畉i 動畛c ghi 竪 b畛i chu畛i th担ng b叩o m畛i v m畛c l畛i
m畛i. Tham s畛 ny ph畉i ch畛 畛nh n畉u msg_id 達 c坦.
 L動u 箪: n畉u tr畉 v畛 0 t畛c l th棚m vo thnh c担ng, tr畉 v畛 1 l th畉t
b畉i.
C畉u tr炭c i畛u 一鞄庄畛n
sp_addmessage 50001,10,'Khong tim thay mau tin %d trong %ls'
sp_addmessage 50002,16,'Khong xoa duoc %s vi %s co ton tai trong
%ls'
sp_addmessage 50003,16,'Mot lop chi co toi da %d hoc sinh'
sp_addmessage 50004,16,'Don gia ban phai lon hon don gia goc'
--xem thong bao loi vua xay dung
use master
sp_helptext sysmessages
Select * From sysmessages Where error =50002
sp_dropmessage 50002
Select * From sysmessages
V鱈 d畛: exec sp_...
C畉u tr炭c i畛u 一鞄庄畛n
--XAY DUNG CAU THONG BAO LOI BANG RAISERROR
use Northwind
RAISERROR (50001,10,1,4,'SANPHAM')
DECLARE @@MA INT
DECLARE @@TEN NVARCHAR
SET @@TEN ='SANPHAM'
SET @@MA =8
SELECT productid FROM products
WHERE productid=@@MA
IF (@@ROWCOUNT=0)
BEGIN
RAISERROR (50001,10,1,@@MA,@@TEN)
END
GO
Ph叩t bi畛u RAISERROR
Th畛 t畛c (Stored Procedure)
Kh叩i ni畛m v畛 th畛 t畛c
C叩c thao t叩c c董 b畉n v畛i th畛 t畛c
Tham s畛 b棚n trong th畛 t畛c
M畛t s畛 v畉n 畛 kh叩c trong th畛 t畛c
38
Kh叩i ni畛m v畛 th畛 t畛c
 M畛t th畛 t畛c l m畛t 畛i t動畛ng trong c董 s畛 d畛 li畛u, bao
g畛m m畛t t畉p nhi畛u c但u l畛nh SQL 動畛c nh坦m l畉i v畛i
nhau thnh m畛t nh坦m v畛i nh畛ng kh畉 nng sau:
 C坦 th畛 bao g畛m c叩c c畉u tr炭c i畛u 一鞄庄畛n (IF, WHILE,
FOR).
 B棚n trong th畛 t畛c l動u tr畛 c坦 th畛 s畛 d畛ng c叩c bi畉n
nh畉m l動u gi畛 c叩c gi叩 tr畛 t鱈nh to叩n 動畛c, c叩c gi叩 tr畛 truy
xu畉t 動畛c t畛 c董 s畛 d畛 li畛u.
 M畛t th畛 t畛c c坦 th畛 nh畉n c叩c tham s畛 truy畛n vo c滴ng
nh動 c坦 th畛 tr畉 v畛 c叩c gi叩 tr畛 th担ng qua c叩c tham s畛.
 Khi m畛t th畛 t畛c l動u tr畛 達 動畛c 畛nh ngh挑a, n坦 c坦 th畛
動畛c g畛i th担ng qua t棚n th畛 t畛c, nh畉n c叩c tham s畛
truy畛n vo, th畛c thi c叩c c但u l畛nh SQL b棚n trong th畛
t畛c v c坦 th畛 tr畉 v畛 c叩c gi叩 tr畛 sau khi th畛c hi畛n xong.
Kh叩i ni畛m v畛 th畛 t畛c
Kh叩i ni畛m v畛 th畛 t畛c
 董n gi畉n ho叩 c叩c thao t叩c tr棚n c董 s畛 d畛 li畛u nh畛 vo
kh畉 nng module ho叩 c叩c thao t叩c ny.
 Th畛 t畛c l動u tr畛 動畛c ph但n t鱈ch, t畛i 動u khi t畉o ra; n棚n
vi畛c th畛c thi ch炭ng nhanh h董n nhi畛u so v畛i vi畛c ph畉i
th畛c hi畛n m畛t t畉p r畛i r畉c c叩c c但u l畛nh SQL t動董ng
動董ng theo c叩ch th担ng th動畛ng.
 Cho ph辿p th畛c hi畛n c湛ng m畛t y棚u c畉u b畉ng m畛t c但u
l畛nh 董n gi畉n thay v狸 ph畉i s畛 d畛ng nhi畛u d嘆ng l畛nh
SQL lm gi畉m thi畛u s畛 l動u th担ng tr棚n m畉ng.
 C坦 th畛 c畉p ph叩t quy畛n cho ng動畛i s畛 d畛ng th担ng qua
c叩c th畛 t畛c l動u tr畛, nh畛 坦 tng kh畉 nng b畉o m畉t 畛i
v畛i h畛 th畛ng.
L畛i 鱈ch c畛a th畛 t畛c
Ph但n lo畉i th畛 t畛c
 C叩c lo畉i Procedures
 User-defined
 System
 Temporary
 Remote
 Extended
 Sp = Stored procedure
 System sp: 動畛c l動u tr畛 trong CSDL master. C叩c
th畛 t畛c c坦 t棚n b畉t 畉u l sp. Ch炭ng 坦ng vai tr嘆
kh叩c nhau c畛a c叩c t叩c v畛 動畛c cung c畉p trong
SQL Server.
 Local sp: 動畛c l動u tr畛 trong c叩c CSDL ng動畛i
d湛ng, n坦 th畛c thi c叩c t叩c v畛 trong CSDL ch畛a n坦.
動畛c ng動畛i s畛 d畛ng t畉o hay t畛 c叩c sp h畛 th畛ng.
Ph但n lo畉i th畛 t畛c
 Temporary sp: gi畛ng local sp nh動ng n坦 ch畛 hi畛n
h畛u cho 畉n khi k畉t n畛i t畉o ra n坦 b畛 坦ng. N坦
動畛c l動u trong CSDL TempDB. C坦 3 lo畉i
temporary sp: Local (private), Global, sp t畉o tr畛c
ti畉p trong TempDB.
 Extended sp: l m畛t th畛 t畛c 動畛c t畉o t畛 c叩c ng担n
ng畛 l畉p tr狸nh kh叩c (kh担ng ph畉i SQL Server) v n坦
動畛c tri畛n khai t鱈nh nng c畛a m畛t th畛 t畛c trong
SQL Server. C叩c th畛 t畛c ny c坦 t棚n b畉t 畉u l xp.
 Remote sp: l m畛t th畛 t畛c 動畛c g畛i th畛c thi t畛
m畛t server t畛 xa.
Ph但n lo畉i th畛 t畛c
V鱈 d畛 v畛 th畛 t畛c
System stored
procedures
sp_stop_job
sp_password
sp_configure
sp_help
sp_helptext
sp_start_job
sp_tables
sp_stored_procedures
sp_server_info
sp_databases
System Store
Procedure
Description
Sp_databases Lists all the databases available on the server.
Sp_server_info Lists server information, such as, character set,
version, and sort order.
Sp_stored_procedures Lists all the stored procedures avaible in the
current environment.
Sp_tables Lists all the objects that can be queried in the
current environment.
Sp_start_job Starts an automated task immediately
Sp_stop_job Stops an automated task that is running
V鱈 d畛 v畛 th畛 t畛c
System Store Procedure Description
Sp_password Change the password for a login account
Sp_configue Changes the SQL Server global configuration
option. When used without options, display the
current server settings.
Sp_help Displays information about any database
object.
Sp_helptext Displays the actual text for a rule, a default, or
an un-define function, trigger or view
V鱈 d畛 v畛 th畛 t畛c
User-defined Stored Procedures
 動畛c t畉o b畛i ng動畛i s畛 d畛ng trong CSDL hi畛n hnh.
 C叩c th畛 t畛c c坦 th畛 動畛c t畉o tr動畛c c叩c 畛i t動畛ng m
th畛 t畛c tham chi畉u 畉n.
C叩ch 1 : D湛ng Enterprise Manager
Right Click at Database, expand Programmability,
expand Stored Procedures, then right click New
Stored Procedure
CREATE PROC [ EDURE ] procedure_name [ ; number ]
[ { @parameter data_type }
[ VARYING ] [ = default ] [ OUTPUT ]
] [,...n ]
[ WITH { RECOMPILE | ENCRYPTION | RECOMPILE,
ENCRYPTION } ]
[ FOR REPLICATION ]
AS sql_statement [ ...n ]
Ki畛m tra s畛 t畛n t畉i c畛a th畛 t畛c:
sp_helptext Procedure_name
sp_help Procedure_name
sp_depends Procedure_name
sp_stored_procedures
C叩ch 2 : D湛ng ph叩t bi畛u CREATE PROCEDURE
User-defined Stored Procedures
User-defined Stored Procedures
 RECOMPILE: Th担ng th動畛ng, th畛 t畛c s畉 動畛c ph但n t鱈ch,
t畛i 動u v d畛ch s畉n 畛 l畉n g畛i 畉u ti棚n. N畉u tu畛 ch畛n
WITH RECOMPILE 動畛c ch畛 畛nh, th畛 t畛c s畉 動畛c d畛ch
l畉i m畛i khi 動畛c g畛i.
 ENCRYPTION: Th畛 t畛c s畉 動畛c m達 ho叩 n畉u tu畛 ch畛n
WITH ENCRYPTION 動畛c ch畛 畛nh. N畉u th畛 t畛c 達
動畛c m達 ho叩, ta kh担ng th畛 xem 動畛c n畛i dung c畛a th畛
t畛c.
VD: Th畛 t畛c kh担ng c坦 tham s畛
CREATE PROC Tong
as
Declare @a int, @b int
Set @a =7
Set @b =3
Print 'Tong = '+convert(varchar(10),@a+@b)
Print 'Hieu = '+convert(varchar(10),@a-@b)
Print 'Tich = '+convert(varchar(10),@a*@b)
If @b<>0
Print 'Thuong = '+convert(varchar(10),@a/@b)
Else
Print 'Khong chia duoc'
--Thuc thi
EXEC Tong
User-defined Stored Procedures
VD: Th畛 t畛c c坦 tham s畛
CREATE PROC Tong1(@a int, @b int)
as
Print 'Tong = '+convert(varchar(10),@a+@b)
Print 'Hieu = '+convert(varchar(10),@a-@b)
Print 'Tich = '+convert(varchar(10),@a*@b)
If @b<>0
Print 'Thuong ='+convert(varchar(10),@a/@b)
Else
Print 'Khong chia duoc'
--Th畛c thi
EXEC Tong1 5,7
User-defined Stored Procedures
User-defined Stored Procedures
CREATE PROCEDURE London_KH AS
SELECT * FROM Customers WHERE City=
'London'
--Thuc thi
Exec LonDon_KH
CREATE PROCEDURE TP_KH (@TP nvarchar(15))
AS
SELECT * FROM Customers WHERE City=@TP
--Thuc thi
Exec TP_KH 'London'
V鱈 d畛
Th畛c thi m畛t Stored Procedure
C炭 ph叩p:
[ EXEC [ UTE ] ]
{ [ @return_status = ]
{ procedure_name [ ;number ] | @procedure_name_var
}
[ [ @parameter = ] { value | @variable [ OUTPUT ] | [ DEFAULT ] ]
[ ,...n ]
[ WITH RECOMPILE ]
V鱈 d畛 1:
EXECUTE TP_KH 'London'
GO
EXECUTE TP_KH 'Paris'
GO
DECLARE @City nvarchar(15), @Return_Value tinyint
SET @City='LonDon'
EXECUTE @Return_Value=TP_KH @City
PRINT @Return_Value
GO
S畛 d畛ng tham s畛
 C坦 2 lo畉i tham s畛:
 Input parameter: tham s畛 nh畉p, 動a gi叩 tr畛 c畛a
tham s畛 畛 th担ng b叩o cho th畛 t畛c n棚n lm g狸 trong
CSDL
 Output parameter: tham s畛 xu畉t ch畛a gi叩 tr畛 tr畉 v畛
c畛a th畛 t畛c.
 Khai b叩o tham s畛:
{@parameter data_type} [= default|NULL][varying]
[OUTPUT]
C炭 ph叩p
CREATE PROCEDURE procedure_name
@Parameter_name data_type
AS
....
S畛 d畛ng tham s畛
T畉o th畛 t畛c v畛i tham s畛
CREATE PROCEDURE city_KH
@KH_city varchar(15)
AS
SELECT * FROM Customers
WHERE City = @KH_city
V鱈 d畛
Th畛c thi th畛 t畛c:
Exec city_KH 'London'
V鱈 d畛:
CREATE PROC prcListCustomer @City char(15)
AS
BEGIN
PRINT 'List of Customers'
SELECT CustomerID,CompanyName,Address,Phone
FROM Customers WHERE City = @City
END
EXEC prcListCustomer 'LonDon'
T畉o th畛 t畛c v畛i tham s畛
V鱈 d畛:
CREATE PROCEDURE CustOrderHist @CustomerID nchar(5)
AS
SELECT ProductName, Total=SUM(Quantity)
FROM Products P, [Order Details] OD, Orders O, Customers C
WHERE C.CustomerID = @CustomerID
AND C.CustomerID = O.CustomerID AND O.OrderID =
OD.OrderID AND OD.ProductID = P.ProductID
GROUP BY ProductName
Exec CustOrderHist 'NORTS'
T畉o th畛 t畛c v畛i tham s畛
Th畛 t畛c c坦 tr畛 tr畉 v畛
 Tr畛 tr畉 v畛 l gi叩 tr畛 ki畛u integer.
 M畉c 畛nh gi叩 tr畛 tr畉 v畛 l 0
C炭 ph叩p
DECLARE @return_variable_name data_type
EXECUTE @return_variable_name =
procedure_name
VD:
CREATE PROC Tinhtoan
@a int, @b int , @tong int output, @hieu int output, @tich int output,
@thuong real output
as
Begin
Set @tong =@a +@b
Set @hieu = @a -@b
Set @tich = @a *@b
if @b<>0
begin
Set @thuong = @a/@b
Print 'Thuong = '+convert(varchar(10),@thuong)
end
Else
Print 'Khong chia duoc'
Set @b = @b *100
End
V鱈 d畛 t畉o th畛 t畛c c坦 gi叩 tr畛 tr畉 v畛
--Th畛c thi:
Declare @tong int, @hieu int, @tich int, @thuong real,
@a int, @b int
Set @a= 8
Set @b=5
Print 'a = '+convert(varchar(10),@a)
Print 'b = '+convert(varchar(10),@b)
EXEC tinhtoan @a, @b, @tong OUTPUT,@hieu OUTPUT,
@tich output, @thuong output
Print 'a = '+convert(varchar(10),@a)
Print 'b = '+convert(varchar(10),@b)
Print 'Tong = '+convert(varchar(10),@tong)
Print 'Hieu = '+convert(varchar(10),@hieu)
Print 'Tich = '+convert(varchar(10),@tich)
Print 'Thuong = '+convert(varchar(10),@thuong)
Go
V鱈 d畛 t畉o th畛 t畛c c坦 gi叩 tr畛 tr畉 v畛
VD:
CREATE PROCEDURE prcGetUnitPrice_UnitsInStock @ProductID int,
@Unitprice Money OUTPUT, @UnitsInStock smallint OUTPUT
AS
BEGIN
IF EXISTS (SELECT * FROM Products
WHERE ProductID = @ProductID)
BEGIN
SELECT
@Unitprice=Unitprice,@UnitsInStock=UnitsInStock
FROM Products
WHERE ProductID=@ProductID
RETURN 0
END
ELSE
RETURN 1
END
V鱈 d畛 t畉o th畛 t畛c c坦 gi叩 tr畛 tr畉 v畛
--Th畛c thi:
Declare @Unitprice Money, @UnitsInStock smallint
EXEC prcGetUnitPrice_UnitsInStock 1, @Unitprice
OUTPUT, @UnitsInStock OUTPUT
Select @Unitprice AS Gia, @UnitsInStock AS
SoLuongTon
V鱈 d畛 t畉o th畛 t畛c c坦 gi叩 tr畛 tr畉 v畛
CREATE PROCEDURE KH_city
@KH_city VARCHAR(15) AS
DECLARE @KH_return int
SELECT @KH_return=COUNT(*) FROM CUSTOMERS
WHERE City = @KH_city
RETURN @KH_return+1
--Thuc thi
Declare @SoKH int
EXEC @SoKH=KH_city 'LonDon'
Print 'So KH la '+convert(varchar(4),@SoKH)
V鱈 d畛
V鱈 d畛 t畉o th畛 t畛c c坦 gi叩 tr畛 tr畉 v畛
VD:
CREATE PROCEDURE prcDisplayUnitPrice_UnitsInStock @ProductID int
AS
BEGIN
DECLARE @UnitPrice Money, @UnitsInStock smallint
DECLARE @ReturnValue Tinyint
EXEC @ReturnValue = prcGetUnitPrice_UnitSInStock @ProductID,
@UnitPrice output, @UnitsInStock output
IF (@ReturnValue = 0)
BEGIN PRINT 'The Status for product: '+ Convert(char(10),
@ProductID)
PRINT 'Unit price : ' + CONVERT( char(10), @Unitprice)
PRINT 'Current Units In Stock:' + CONVERT (char(10),
@UnitsInStock)
END
ELSE PRINT 'No records for the given productID ' +
Convert(char(10), @ProductID)
END
V鱈 d畛 t畉o th畛 t畛c c坦 gi叩 tr畛 tr畉 v畛
--Th畛c thi:
EXECUTE prcDisplayUnitPrice_UnitsInStock 1222
GO
EXECUTE prcDisplayUnitPrice_UnitsInStock 1
V鱈 d畛 t畉o th畛 t畛c c坦 gi叩 tr畛 tr畉 v畛
S畛a m畛t th畛 t畛c - Stored Procedure
ALTER PROCEDURE KH_city
AS
SELECT * FROM dbo.Customers;
Exec KH_city
S畛a m畛t th畛 t畛c - Stored Procedure
 Example:
ALTER PROC prcListCustomer @City char(15)=NULL
AS
BEGIN
IF @city is NULL
BEGIN
PRINT 'Usage: prcListCustomer <City>'
RETURN
END
PRINT 'List of Customers'
SELECT CustomerID,CompanyName,Address,Phone
FROM Customers
WHERE City = @City
END
 VD:
ALTER PROC prcListCustomer @City char(15)
AS
BEGIN
IF EXISTS (SELECT * FROM Customers WHERE City=@city)
BEGIN
PRINT 'List of Customers'
SELECT CustomerID,CompanyName,Address,Phone
FROM Customers WHERE City = @City
RETURN 0
END
ELSE
BEGIN
PRINT 'No Records Found for given city'
RETURN 1
END
END
S畛a m畛t th畛 t畛c - Stored Procedure
X坦a m畛t Stored Procedure
DROP PROCEDURE proc_name
V鱈 d畛:
DROP PROCEDURE City_KH
HM (Function)
 Kh叩i ni畛m v畛 Hm
 C叩c lo畉i hm
 C叩c lo畉i gi叩 tr畛 tr畉 v畛 c畛a UDFs
 T畉o v qu畉n l箪 hm UDFs
 Scalar Function
 Table-valued Function
 S畛 d畛ng hm UDFs
Kh叩i ni畛m v畛 Hm
 Hm t動董ng t畛 th畛 t畛c bao g畛m c叩c ph叩t bi畛u T-SQL v
m畛t s畛 c畉u tr炭c i畛u 一鞄庄畛n 動畛c l動u v畛i m畛t t棚n v 動畛c
x畛 l箪 nh動 m畛t 董n v畛 畛c l畉p. Hm 動畛c bi棚n d畛ch tr動畛c,
kh担ng c畉n ki畛m tra v bi棚n d畛ch l畉i.
 i畛m kh叩c bi畛t gi畛a hm v th畛 t畛c l hm tr畉 v畛 m畛t gi叩
tr畛 th担ng qua t棚n hm c嘆n th畛 t畛c th狸 kh担ng.
Kh叩i ni畛m v畛 Hm
 Hm 動畛c d湛ng trong:
 L畛nh Print hay l畛nh Select 畛 hi畛n th畛 gi叩 tr畛 tr畉 v畛
c畛a hm.
 Danh s叩ch ch畛n c畛a m畛t c但u l畛nh Select 畛 cho ra
m畛t gi叩 tr畛.
 M畛t i畛u ki畛n t狸m ki畉m c畛a m畛nh 畛 Where trong
c叩c c但u l畛nh T-SQL.
働u i畛m c畛a Hm
Ng動畛i g畛i ch畛 g畛i m畛t c但u l畛nh 董n v SQL Server ch畛
ki畛m tra m畛t l畉n sau 坦 t畉o ra m畛t execute plan v
th畛c thi. C炭 ph叩p c畛a c叩c c但u l畛nh SQL 達 動畛c SQL
Sever ki畛m tra tr動畛c khi save n棚n n坦 kh担ng c畉n ki畛m
l畉i khi th畛c thigi畉m ngh畉n m畉ng
B畉o tr狸 (maintainability) d畛 dng h董n do vi畛c t叩ch r畛i gi畛a
business rules v database. N畉u c坦 m畛t s畛 thay 畛i
no 坦 v畛 m畉t logic th狸 ta ch畛 vi畛c thay 畛i code b棚n
trong hm m th担i
Security: c坦 th畛 動畛c encrypt (m達 h坦a) 畛 tng c動畛ng
t鱈nh b畉o m畉t.
C叩c lo畉i Hm
 C坦 hai lo畉i:
 Built-in functions: Ho畉t 畛ng nh動 l m畛t 畛nh ngh挑a
trong T-SQL v kh担ng th畛 hi畛u ch畛nh. Ch畛 動畛c tham
chi畉u trong c叩c c但u l畛nh T-SQL. Tr畛 tr畉 v畛 l m畛t t畉p
c叩c d嘆ng(Rowset), v担 h動畛ng(scalar) v
aggregate(th畛ng k棚).
 User-define functions hay c嘆n g畛i l UDFs: do
ng動畛i d湛ng t畛 畛nh ngh挑a 畛 叩p 畛ng m畛t m畛c ti棚u
no 坦. C叩c tham s畛 truy畛n vo kh担ng 動畛c mang
thu畛c t鱈nh OUTPUT, do 坦 gi叩 tr畛 tr畉 v畛 cho hm b畉ng
ph叩t bi畛u RETURN. Gi叩 tr畛 tr畉 v畛 l gi叩 tr畛 v担 h動畛ng
(Scalar valued) hay b畉ng (Table  valued).
C叩c lo畉i gi叩 tr畛 tr畉 v畛 c畛a UDFs
 Scalar Function: M畛t hm v担 h動畛ng tr畉 v畛 m畛t gi叩 tr畛 董n v c坦
th畛 動畛c d湛ng b畉t c畛 n董i no c畛a bi畛u th畛c hay c坦 th畛 動畛c
d湛ng c但u l畛nh SELECT, m畛nh 畛 SET c畛a l畛nh UPDATE,... M畛t
hm v担 h動畛ng c坦 th畛 動畛c xem nh動 k畉t qu畉 c畛a vi ph辿p to叩n
hay hm chu畛i.
 Table-valued Function : M畛t hm c坦 gi叩 tr畛 tr畉 v畛 l m畛t t畉p k畉t
qu畉 v c坦 th畛 動畛c d湛ng b畉t c畛 n董i no m b畉ng hay view 動畛c
d湛ng. Hm gi叩 tr畛 b畉ng c坦 th畛 動畛c tham chi畉u trong m畛nh 畛
FROM c畛a c但u l畛nh SELECT.
 T棚n v nh畛ng th担ng tin v畛 Function khi 動畛c t畉o ra s畉 ch畛a
trong SysObjects table c嘆n ph畉n text c畛a n坦 ch畛a trong
SysComments table.
C叩c l畛nh t畉o v qu畉n l箪 UDF
 T畉o Hm
CREATE FUNCTION <TenHam>
 S畛a Hm
ALTER FUNCTION <TenHam>
 X坦a Hm
DROP FUNCTION statement
 Th畛c thi Hm
D湛ng l畛nh Print
D湛ng L畛nh Select
 Xem c叩c l畛nh c畛a UDFs
Sp_helptext TenHam
Scalar Function
1. Scalar Function Kh担ng c坦 tham s畛
 L hm kh担ng nh畉n gi叩 tr畛 t畛 b棚n ngoi truy畛n
vo.
 C炭 ph叩p:
CREATE FUNCTION
[Owner_name.]function_name
RETURNS scalar_return_data_type
[WITH { ENCRYPTION | SCHEMABINDING } ]
[ AS ]
BEGIN
function_body
RETURN scalar_expression
END
 V鱈 d畛 1 : Hm tr畉 v畛 t畛ng 2 s畛 4 v 6
Create Function tong2so()
Returns int
as
Begin
Declare @so1 int, @so2 int
Set @so1 = 4
Set @so2 =6
Return @so1+@so2
End
--thuc hien
Print 'Tong = ' +convert(char(10),dbo.tong2so())
Select dbo.tong2so() as Tong
Scalar Function  T畉o Hm
Alter Function tong2so()
Returns int
With Encryption
as
Begin
Declare @so1 int, @so2 int
Set @so1 = 4
set @so2 =6
Return @so1+@so2
End
--Xem l畛nh
sp_helptext tong2so
--Th畛c hi畛n
print 'Tong = ' +convert(char(10),dbo.tong2so())
select dbo.tong2so() as Tong
--X坦a hm
Drop function Tong2so
Scalar Function  S畛a v X坦a Hm
V鱈 d畛 2 : Hm tr畉 v畛 t畛ng ti畛n c畛a kh叩ch hng c坦 m達 l TOMSP
Create function Tongtien()
Returns money
AS
Begin
Declare @tong money
Select @tong = sum(unitprice*Quantity) from orders o,
[Order Details] d
where o.orderid = d.orderid and customerid = 'TOMSP'
Return @tong
End
print 'Tong = ' +convert(char(10),dbo.tongtien())
select dbo.tongtien() as [Tong Tien Cua Khach Hang TOMSP]
Scalar Function
2. Scalar Function C坦 tham s畛
 L hm nh畉n c叩c gi叩 tr畛 t畛 b棚n ngoi truy畛n vo.
 C炭 ph叩p:
CREATE FUNCTION [owner_name.]function_name
([{@parameter_name [AS] data_type [=default]} [
,n ]])
RETURNS scalar_return_data_type
[WITH { ENCRYPTION | SCHEMABINDING } ]
[ AS ]
BEGIN
function_body
RETURN scalar_expression
END
Scalar Function
V鱈 d畛 : Hm tr畉 v畛 t畛ng c畛a hai s畛 b畉t k畛
Create function tong(@so1 int, @so2 int)
Returns int
as
Begin
Return @so1+@so2
End
-- Thuc hien ham
Declare @a int, @b int
Set @a = 4
Set @b =6
Print 'Tong cua '+convert(char(5),@a) +' '+
convert(char(5),@b)+'='+convert(char(5),dbo.tong(@a,@b))
Select dbo.tong(@a,@b) as tong
Scalar Function
VD: Hm tr畉 v畛 t畛ng ti畛n c畛a kh叩ch hng no 坦
Create function TongtienTS(@makh nchar(5))
Returns money
AS
Begin
Declare @tong money
Select @tong = sum(unitprice*Quantity) From orders o, [Order
Details] d
Where o.orderid = d.orderid and customerid = @makh
Return @tong
End
Declare @ma nchar(5)
Set @ma = 'TOMSP'
Print 'Tong = ' +convert(char(10),dbo.tongtients(@ma))
Select dbo.tongtients(@ma) as Tong
Scalar Function
Bi t畉p 叩p d畛ng : Hm tr畉 v畛 th畛 b畉ng ti畉ng Vi畛t
Create function thu(@ngay datetime)
Returns varChar(10)
As
Begin Declare @t varchar(10), @d tinyint
Set @d = datepart(dw,@ngay)
Set @t = case
When @d = 1 then 'Chu Nhat'
When @d = 2 then 'Hai'
When @d = 3 then 'Ba'
When @d = 4 then 'Tu'
When @d = 5 then 'Nam'
When @d = 6 then 'Sau'
When @d = 7 then 'Bay'
end
Return @t
End
Scalar Function
--Th畛c thi
Declare @ngaysinh datetime
Set @ngaysinh = getdate()
Print 'Ban sinh vao Thu '+dbo.thu(@ngaysinh) +
' Ngay '+ convert(char(3),day(@ngaysinh)) + ' thang ' +
Convert(char(3), month(@ngaysinh))+' nam '
+convert(char(5),year(@ngaysinh))
--Thuc hien voi cau lenh Select
Select employeeid, LastName +' '+FirstName as Hoten, thu =
dbo.thu(birthdate) from Employees
Select employeeid, LastName +' '+FirstName as Hoten, [Thu Ngay
Thang Nam Sinh] ='Thu '+dbo.thu(birthdate) +' Ngay '+
convert(char(2),day(birthdate)) + ' thang ' + Convert(char(2),
month(birthdate))+ ' nam ' +convert(char(4),year(birthdate))
from Employees
Scalar Function
BT2 : Hm tr畉 v畛 T畛ng ti畛n c畛a c叩c s畉n ph畉m
Create function TotalAmount
(@Unitprice money, @quantity Smallint,@Discount real)
Returns Money
As
Begin
Return (@Unitprice * @Quantity)*(1-@discount)
End
--Su dung
Select Productid, Total =
dbo.TotalAmount(Unitprice,Quantity,Discount)
From [Order Details]
Where Orderid =10250
Scalar Function
BT t畛 lm:
Vi畉t hm tr畉 v畛 chi畉t kh畉u c畛a s畉n ph畉m d畛a vo s畛 l動畛ng
l畉p ho叩 董n v theo quy 畛nh sau:
-N畉u s畛 l動畛ng <=5 th狸 chi畉t kh畉u l 0.05
-N畉u s畛 l動畛ng t畛 6 畉n 10 th狸 chi畉t kh畉u 0.07
-N畉u s畛 l動畛ng t畛 11 畉n 20 th狸 chi畉t kh畉u l 0.09
ng動畛c l畉i th狸 chi畉t kh畉u l 0.1
Scalar Function
The table-valued UDFs
 The table-valued UDFs: 動畛c chia thnh hai lo畉i l inline v
multistatement table-valued.
 Inline table-valued UDF:
 動畛c xem nh動 l m畛t View c坦 tham s畛. Th畛c thi m畛t c但u
l畛nh Select nh動 trong m畛t view nh動ng c坦 th畛 bao g畛m c叩c
tham s畛 gi畛ng th畛 t畛c
 C炭 ph叩p:
CREATE FUNCTION [owner_name.]function_name
([{@parameter_name [AS] data_type [=default]} [ ,n ]])
RETURNS TABLE
[WITH { ENCRYPTION | SCHEMABINDING }]
[AS]
RETURN [(] select-statement [)]
The table-valued UDFs
V鱈 d畛 1: Cho bi畉t t畛ng s畛 h坦a 董n c畛a kh叩ch hng b畉t k畛.
CREATE FUNCTION CountOrderCust (@cust varchar(5))
RETURNS TABLE
AS
RETURN (Select CustomerID, count(orderid) as countOrder
From orders
Where customerID like @cust
Group by customerID )
 Thi hnh (kh担ng c畉n t棚n 畉y 畛)
Select * From CountOrderCust('A%' )
 Declare @ma nvarchar(5)
Set @ma='A%'
Select * from CountOrderCust(@ma)
The table-valued UDFs
V鱈 d畛 2 : tr畉 v畛 t畛ng s畛 l動畛ng c畛a t畛ng s畉n ph畉m theo lo畉i hng no 坦.
CREATE FUNCTION SalesByCategory(@Categoryid Int)
RETURNS TABLE
AS
RETURN
(SELECT c.CategoryName, P. ProductName,
SUM(Quantity) AS TotalQty
FROM Categories c
INNER JOIN Products p ON c.CategoryID= p. CategoryID
INNER JOIN [Order Details] od ON p.ProductID = od.ProductID
WHERE c.CategoryID= @Categoryid
GROUP BY c. CategoryName,p.ProductName)
 Th畛c thi
SELECT * FROM SalesByCategory (1)
The table-valued UDFs
 Multistatement Table-valued UDF: l d畉ng ph畛c t畉p nh畉t.
Lo畉i hm ny x但y d畛ng t畉p k畉t qu畉 t畛 m畛t hay nhi畛u c但u
l畛nh Select
 C炭 ph叩p:
CREATE FUNCTION [owner_name.]function_name
([{@parameter_name [AS] data_type [=default]} [ ,n ]])
RETURNS @return_variable
TABLE ({column_definition | table_constraint} [ ,n ])
[WITH { ENCRYPTION | SCHEMABINDING } ]
[AS]
BEGIN
function_body
RETURN
END
The table-valued UDFs
V鱈 d畛 1
CREATE FUNCTION CountOrderCust()
RETURNS @fn_CountOrderCust TABLE
(OrderIdent tinyint Not null, Cust varchar(5) )
AS
Begin
Insert @fn_CountOrderCust
Select Count(orderid),CustomerId From Orders
Group by Customerid
Return
End
--Thi hnh
Select * From CountOrderCust()
The table-valued UDFs
V鱈 d畛 2
CREATE FUNCTION Contacts(@suppliers bit=0)
RETURNS @Contacts TABLE (ContactName nvarchar(30), Phone nvarchar(24),
ContactType nvarchar(15))
AS BEGIN
INSERT @Contacts
SELECT ContactName, Phone, 'Customer' FROM Customers
INSERT @Contacts
SELECT FirstName + ' ' + LastName, HomePhone, 'Employee'
FROM Employees
IF @Suppliers=1
INSERT @Contacts
SELECT ContactName, Phone, 'Supplier' FROM Suppliers
RETURN
END
-- Th畛c thi
SELECT * FROM CONTACTS(1) ORDER BY ContactName
S畛 d畛ng UDFs
 Scalar UDF: khi g畛i lu担n lu担n theo c炭 ph叩p: owner.functionname.
V鱈 d畛:
SELECT ProductID, Total=dbo.TotalAmount(UnitPrice, Quantity,
Discount)
FROM [Order details]
WHERE OrderID=10250
 Scalar UDF c坦 th畛 動畛c s畛 d畛ng trong bi畛u th畛c, trong c但u l畛nh
SELECT hay l畛nh CREATE TABLE
CREATE TABLE [Order Details] (
OrderID int NOT NULL , ProductID int NOT NULL ,
UnitPrice money NOT NULL DEFAULT (0),
Quantity smallint NOT NULL DEFAULT (1),
Discount real NOT NULL DEFAULT (0),
Total AS dbo.TotalAmount(UnitPrice, Quantity, Discount))
S畛 d畛ng UDFs
 A table-valued UDF: C坦 th畛 動畛c g畛i theo c炭 ph叩p
owner.functionname hay functionname
SELECT * FROM Contacts(1) ORDER BY ContactName
 N畉u table-valued function kh担ng c坦 tham s畛, b畉n ph畉i s畛
d畛ng d畉u()
 N畉u tham s畛 c坦 gi叩 tr畛 m畉c 畛nh, b畉n ph畉i truy畛n gi叩 tr畛
vo m畉c d湛 b畉n c坦 s畛 d畛ng t畛 kh坦a DEFAULT
SELECT * FROM Contacts() ORDER BY ContactName
S畛 d畛ng UDFs
 Bi t畉p t畛 lm:
Vi畉t hm tr畉 v畛 danh s叩ch c叩c ho叩 董n 達 l畉p c畛a m畛t
kh叩ch hng no 坦 trong m畛t th叩ng nm no 坦. Th担ng
tin g畛m: Makh, TenKh, Diachi, mahd, ngaylapHD,
Noichuyen, LoaiHD. Trong 坦, LoaiHD 動畛c hi畛n th畛 r探 l
Nh畉p ho畉c Xu畉t.

More Related Content

Similar to C4.SQL-LapTrinhT_SQL.pdfddadadsadadsdadd (20)

Chuan viet code va thiet ke giao dien trong C#
Chuan viet code va thiet ke giao dien trong C#Chuan viet code va thiet ke giao dien trong C#
Chuan viet code va thiet ke giao dien trong C#
Kuli An
Asp
AspAsp
Asp
thinhtu
6.adapterset
6.adapterset6.adapterset
6.adapterset
Dao Uit
C叩c v鱈 d畛 v畛 c叩ch vi畉t v s畛 d畛ng ch動董ng tr狸nh con
C叩c v鱈 d畛 v畛 c叩ch vi畉t v s畛 d畛ng ch動董ng tr狸nh conC叩c v鱈 d畛 v畛 c叩ch vi畉t v s畛 d畛ng ch動董ng tr狸nh con
C叩c v鱈 d畛 v畛 c叩ch vi畉t v s畛 d畛ng ch動董ng tr狸nh con
Nhungoc Phamhai
C9 templates
C9 templatesC9 templates
C9 templates
Ti畉n Quang Phan
C9 templates
C9 templatesC9 templates
C9 templates
H畛 L畛i
Hdth07 ltudql02-linq-ep1
Hdth07 ltudql02-linq-ep1Hdth07 ltudql02-linq-ep1
Hdth07 ltudql02-linq-ep1
D滴ng inh
L畛p k畉t n畛i csdl d湛ng jdbc trong java
L畛p k畉t n畛i csdl d湛ng jdbc trong javaL畛p k畉t n畛i csdl d湛ng jdbc trong java
L畛p k畉t n畛i csdl d湛ng jdbc trong java
ANHMATTROI
C3-Javascript.pdf
C3-Javascript.pdfC3-Javascript.pdf
C3-Javascript.pdf
ChnhNguynTh1
LINQ
LINQLINQ
LINQ
Hiep Luong
Chuong 4 - SQL - University of Information Technology.pdf
Chuong 4 - SQL - University of Information Technology.pdfChuong 4 - SQL - University of Information Technology.pdf
Chuong 4 - SQL - University of Information Technology.pdf
NguyncHin521584
Lec3. Ham.pdf
Lec3. Ham.pdfLec3. Ham.pdf
Lec3. Ham.pdf
KinHongnh
Ung dung web chuong 4
Ung dung web  chuong 4Ung dung web  chuong 4
Ung dung web chuong 4
Giang Nguy畛n
1. Python c董 b畉n.docx
1. Python c董 b畉n.docx1. Python c董 b畉n.docx
1. Python c董 b畉n.docx
SonViet3
KTMT-Chuong 5 - H畛p ng畛.pptaaaaaaaaaaaaa
KTMT-Chuong 5 -  H畛p ng畛.pptaaaaaaaaaaaaaKTMT-Chuong 5 -  H畛p ng畛.pptaaaaaaaaaaaaa
KTMT-Chuong 5 - H畛p ng畛.pptaaaaaaaaaaaaa
NguynnhPhc15
Chuan viet code va thiet ke giao dien trong C#
Chuan viet code va thiet ke giao dien trong C#Chuan viet code va thiet ke giao dien trong C#
Chuan viet code va thiet ke giao dien trong C#
Kuli An
6.adapterset
6.adapterset6.adapterset
6.adapterset
Dao Uit
C叩c v鱈 d畛 v畛 c叩ch vi畉t v s畛 d畛ng ch動董ng tr狸nh con
C叩c v鱈 d畛 v畛 c叩ch vi畉t v s畛 d畛ng ch動董ng tr狸nh conC叩c v鱈 d畛 v畛 c叩ch vi畉t v s畛 d畛ng ch動董ng tr狸nh con
C叩c v鱈 d畛 v畛 c叩ch vi畉t v s畛 d畛ng ch動董ng tr狸nh con
Nhungoc Phamhai
C9 templates
C9 templatesC9 templates
C9 templates
H畛 L畛i
Hdth07 ltudql02-linq-ep1
Hdth07 ltudql02-linq-ep1Hdth07 ltudql02-linq-ep1
Hdth07 ltudql02-linq-ep1
D滴ng inh
L畛p k畉t n畛i csdl d湛ng jdbc trong java
L畛p k畉t n畛i csdl d湛ng jdbc trong javaL畛p k畉t n畛i csdl d湛ng jdbc trong java
L畛p k畉t n畛i csdl d湛ng jdbc trong java
ANHMATTROI
C3-Javascript.pdf
C3-Javascript.pdfC3-Javascript.pdf
C3-Javascript.pdf
ChnhNguynTh1
Chuong 4 - SQL - University of Information Technology.pdf
Chuong 4 - SQL - University of Information Technology.pdfChuong 4 - SQL - University of Information Technology.pdf
Chuong 4 - SQL - University of Information Technology.pdf
NguyncHin521584
Lec3. Ham.pdf
Lec3. Ham.pdfLec3. Ham.pdf
Lec3. Ham.pdf
KinHongnh
Ung dung web chuong 4
Ung dung web  chuong 4Ung dung web  chuong 4
Ung dung web chuong 4
Giang Nguy畛n
1. Python c董 b畉n.docx
1. Python c董 b畉n.docx1. Python c董 b畉n.docx
1. Python c董 b畉n.docx
SonViet3
KTMT-Chuong 5 - H畛p ng畛.pptaaaaaaaaaaaaa
KTMT-Chuong 5 -  H畛p ng畛.pptaaaaaaaaaaaaaKTMT-Chuong 5 -  H畛p ng畛.pptaaaaaaaaaaaaa
KTMT-Chuong 5 - H畛p ng畛.pptaaaaaaaaaaaaa
NguynnhPhc15

C4.SQL-LapTrinhT_SQL.pdfddadadsadadsdadd

  • 2. K畛 thu畉t thi hnh l畛nh T-SQL C叩c c畉u tr炭c i畛u 一鞄庄畛n Stored Procedure (th畛 t畛c) Function (hm) 2 N畛i dung
  • 3. C董 b畉n v畛 l畉p tr狸nh b畉ng T_SQL Khai b叩o v s畛 d畛ng bi畉n C叩c c畉u tr炭c l畛nh RaiseError
  • 4. IDENTIFIER (畛nh danh) T棚n c畛a c叩c 畛i t動畛ng 畛u 動畛c g畛i l 畛nh danh. Trong SQL Server, c坦 c叩c 畛nh danh nh動 Server, Databases, Object of Database as Table, View, Index, Constraint, Qui t畉c 畛nh danh: T畛i a 128 k箪 t畛. B畉t 畉u l m畛t k箪 t畛 t畛 A-Z B畉t 畉u l m畛t k箪 hi畛u @, # s畉 c坦 m畛t 箪 ngh挑a kh叩c. Nh畛ng 畛nh danh no c坦 d畉u kho畉ng tr畉ng 畛 gi畛a th狸 ph畉i k畉p trong d畉u [] ho畉c 畉t 畛nh danh sao cho ng畉n g畛n, 畉y 畛 箪 ngh挑a, ph但n bi畛t gi畛a c叩c 畛i t動畛ng v畛i nhau, kh担ng tr湛ng l畉p, kh担ng tr湛ng v畛i t畛 kh坦a c畛a T-SQL.
  • 5. Tham chi畉u 畉n c叩c 畛i t動畛ng trong SQL Server C炭 ph叩p: Server.Database.Owner.Object Hay: Server.Database..Object V鱈 d畛: Create Table Northwind.dbo.Customers Create Table Northwind..Customers
  • 6. Data type, Batch, Script Ki畛u d畛 li畛u (Data type) : c坦 hai lo畉i Ki畛u d畛 li畛u h畛 th畛ng: Do h畛 th畛ng cung c畉p Ki畛u d畛 li畛u do ng動畛i d湛ng 畛nh ngh挑a (User defined data types.) G坦i l畛nh (Batch) Bao g畛m c叩c ph叩t bi畛u T-SQL v k畉t th炭c b畉ng l畛nh GO. C叩c l畛nh trong g坦i l畛nh s畉 動畛c bi棚n d畛ch v th畛c thi c湛ng m畛t l炭c. N畉u m畛t l畛nh trong batch b畛 l畛i th狸 batch c滴ng xem nh動 l畛i C叩c ph叩t bi畛u Create b畛 rng bu畛c trong m畛t batch 董n. Ex : Use Northwind Select * from Customers GO K畛ch b畉n (Script ) M畛t k畛ch b畉n l m畛t t畉p c畛a m畛t hay nhi畛u b坦 l畛nh 動畛c l動u l畉i thnh m畛t t畉p tin .SQL
  • 7. Bi畉n Bi畉n c畛c b畛 Bi畉n l m畛t 畛i t動畛ng d湛ng 畛 l動u tr畛 d畛 li畛u. Bi畉n ph畉i 動畛c khai b叩o tr動畛c khi d湛ng. C坦 2 lo畉i bi畉n: c畛c b畛 v ton c畛c Bi畉n c畛c b畛: 動畛c khai b叩o trong ph畉n th但n c畛a m畛t b坦 l畛nh hay m畛t th畛 t畛c. Ph畉m vi ho畉t 畛ng c畛a bi畉n b畉t 畉u t畛 i畛m m n坦 動畛c khai b叩o cho 畉n khi k畉t th炭c m畛t b坦 l畛nh, m畛t th畛 t畛c hay m畛t hm m n坦 動畛c khai b叩o. T棚n c畛a bi畉n b畉t 畉u b畉ng @
  • 8. V鱈 d畛 DECLARE @makh CHAR(5) SET @makh = 'ANTON' SELECT * FROM Customers WHERE Customerid = @makh S畛 d畛ng bi畉n c畛c b畛 Khai b叩o DECLARE @var_name = expression SELECT {@var_name = expression}[,n]
  • 9. VD : DECLARE @manv int SET @manv = 2 SELECT * FROM Employees WHERE Employeeid = @manv DECLARE @manv int, @country nvarchar(15) SET @manv = 3 SET @country ='Usa' SELECT * FROM Employees WHERE Employeeid = @manv and country =@country S畛 d畛ng bi畉n c畛c b畛
  • 10. VD DECLARE @tong int Select @tong = Sum(quantity * Unitprice) From [Order details] SELECT @tong as tongtien Print 'Tong tien = '+ convert(varchar(20),@tong) DECLARE @masp int Select @masp = productid From Northwind..Products Select @masp c畛a d嘆ng cu畛i trong b畉ng DECLARE @Masp int Select @masp = Productid From Northwind..Products Order by Productid DESC Select @masp as 'Ma SP' S畛 d畛ng bi畉n c畛c b畛
  • 11. Bi畉n ton c畛c 動畛c 畛nh ngh挑a nh動 hm h畛 th畛ng. C叩c bi畉n ny kh担ng c坦 ki畛u. T棚n b畉t 畉u b畉ng @@ Bi畉n ton c畛c
  • 12. Variable Return value @@Trancount @@Servername @@Rowcount @@Identity @@Error @@Fetch_status Number of transactions currently open on the connection Name of local servers running SQL Server Number of rows affected by the latest SQL statement Return last Number Identity Return order number Error when SQL exculate, return 0 when The command completed successfully Return status of Fetch command of pointer variable (0 :Success, -1 : Mistake or exceed range, -2 : Unsuccess C叩c bi畉n ton c畛c
  • 13. VD: --How many are transaction opening If (@@Trancount>0) Begin Raiserror ('Take can not be executed within a transaction',10,1) Return End --Number of rows affected by the latest SQL statement Use Northwind Update Employees Set LastName ='Brooke' where LastName ='Lan' If (@@RowCount =0) Begin Print 'Warning : No rows were updated' Return End Update Customers Set Phone ='030' + Phone Where Country = 'German' Print @@Rowcount C叩c bi畉n ton c畛c
  • 14. --Tra ve so Identitity phat sinh sau cung Create table hd (Mahd int identity Primary key, Ghichu varchar(20)) Create table cthd(Mahd int,Masp char(10), Soluong int) Insert into hd Values ('Record 1') Insert into hd Values ('Record 2') Declare @maso int Set @maso = @@identity Insert into cthd Values (@maso,'sp001',5) Insert into cthd Values (@maso,'sp002',12) Select * from hd Select * from cthd C叩c bi畉n ton c畛c
  • 15. C畉u tr炭c i畛u 一鞄庄畛n
  • 16. Kh畛i BEGIN...END: N畉u nhi畛u ph叩t bi畛u c畉n th畛c thi c坦 li棚n quan v畛i nhau th狸 畉t c叩c ph叩t bi畛u ny trong BeginEnd C炭 ph叩p: BEGIN statement | statement_block END RETURN: Tr畉 v畛 m畛t gi叩 tr畛, l畛nh ny n畉m trong m畛t block (kh畛i) hay procedure. N畉u g畉p ph叩t bi畛u Return, qu叩 tr狸nh x畛 l箪 k畉t th炭c C炭 ph叩p Return [Integer_expression] C畉u tr炭c i畛u 一鞄庄畛n
  • 17. L畛nh PRINT: D湛ng 畛 in th担ng tin ra mn h狸nh k畉t qu畉 c畛a SQL. C炭 ph叩p: PRINT any ASCII text|@local_variable|@@Function |string_expr V鱈 d畛: Print 'Hello' Print N'Cho b畉n' Print getdate() Print @@version Declare @ten nvarchar(15) Set @ten ='Nguyen Minh' Print @ten C畉u tr炭c i畛u 一鞄庄畛n
  • 18. C畉u tr炭c i畛u 一鞄庄畛n IF...ELSE: Cho ph辿p th畛c thi m畛t hay nhi畛u l畛nh t湛y thu畛c vo m畛t i畛u ki畛n no 坦. C炭 ph叩p: If Condition statements [Else [Condition 1] statements] V鱈 d畛 : If (Select Count(*) From Customers Where Country ='Germany')>0 print 'Co khach hang o Germany' Else print 'Khong co khach hang o Germany' C畉u tr炭c i畛u 一鞄庄畛n
  • 19. V鱈 d畛: Declare @msg varchar(100) If (Select Count(Unitprice) From Products Where QuantityPerunit like '%box%')>0 Begin Set NOCOUNT ON Set @msg = 'Co vai sp co don vi tinh co chu box. Cac sp do la :' Select @msg Select ProductName From Products where QuantityPerunit like '%box%' End Else print 'Khong co sp nao co dvt co chu box' C畉u tr炭c i畛u 一鞄庄畛n
  • 20. V鱈 d畛: If (Select Avg(Unitprice) From Products where QuantityPerUnit like '%box%' )>0 Begin Set NOCOUNT on Declare @msg nvarchar(30) Set @msg = 'Co vai sp c坦 don vi tinh co chu box. Cac sp do la:' Select @msg Select ProductName From Products where QuantityPerUnit like '%box%' End Else print 'Khong co sp nao co dvt co chu box' C畉u tr炭c i畛u 一鞄庄畛n
  • 21. CASE : l m畛t bi畛u th畛c i畛u ki畛n 動畛c 叩p d畛ng b棚n trong m畛t ph叩t bi畛u kh叩c. Case tr畉 v畛 c叩c gi叩 tr畛 kh叩c nhau t湛y vo i畛u ki畛n hay m畛t i畛u 一鞄庄畛n no 坦. C炭 ph叩p 1 : Case input_expression When when_expression Then resulf_expression[n] [ELSE else_result_expression] End C炭 ph叩p 2 : Case Boolean_expression When Boolean_expression Then resulf_expression[n] [ ELSE else_result_expression ] End C畉u tr炭c i畛u 一鞄庄畛n
  • 22. Example 1 : Declare @a int, @b int, @Hieu int Set @a = 15 Set @b =27 Set @hieu = Case When @a<@b then @b-@a When @a>@b then @a-@b Else 0 End Print 'Hieu='+convert(varchar(20),@hieu) Example 2 : Select ProductName, Unitprice, 'Classification'=CASE When Unitprice<10 then 'Low price' When Unitprice Between 10 and 20 then 'Moderately Price' When Unitprice>20 then 'Expensive' Else 'Unknown' END From Products C畉u tr炭c i畛u 一鞄庄畛n
  • 23. Select Productid, Quantity, UnitPrice, [discount%]= CASE When Quantity <=5 then 0.05 When Quantity between 6 and 10 then 0.07 When Quantity between 11 and 20 then 0.09 Else 0.1 END From [Order Details] Order by Quantity, Productid C畉u tr炭c i畛u 一鞄庄畛n
  • 24. GOTO: chuy畛n th畛c thi ch動董ng tr狸nh 畉n v畛 tr鱈 nh達n (label) Example Declare @a int, @b int, @Hieu int Set @a = 39 Set @b =10 hieu_loop: if @a>@b begin Set @hieu =@A-@B print 'a= '+convert(varchar(20),@a) print 'b= '+convert(varchar(20),@b) print 'hieu= '+convert(varchar(20),@hieu) Set @a =@hieu Goto hieu_loop end print 'a='+convert(varchar(20),@a) print 'b='+convert(varchar(20),@b) print 'hieu='+convert(varchar(20),@hieu) C畉u tr炭c i畛u 一鞄庄畛n
  • 25. Ph叩t bi畛u l畉p WHILE: V嘆ng l畉p s畉 th畛c thi cho 畉n khi bi畛u th畛c i畛u ki畛n (Boolean expression) trong While mang gi叩 tr畛 False. C炭 ph叩p 1 : WHILE Boolean_expression {sql_statement | statement_block} [BREAK] {sql_statement | statement_block} [CONTINUE] C畉u tr炭c i畛u 一鞄庄畛n
  • 26. Example : Use Northwind While (Select Avg(unitprice) From [Order Details]) <$50 Begin Update [Order Details] SET Unitprice = Unitprice *2 Select Max(Unitprice) From [Order Details] If (Select Max(Unitprice) From [Order Details])>$50 BREAK Else CONTINUE End Print 'Too much for the market to bear' C畉u tr炭c i畛u 一鞄庄畛n
  • 27. WAITFOR: SQL Server t畉m d畛ng m畛t th畛i gian tr動畛c khi x畛 l箪 ti畉p c叩c ph叩t bi畛u sau 坦. C炭 ph叩p : WAITFOR {DELAY time |TIME time} Time : hh:mm:ss Deplay time: h畛 th畛ng t畉m d畛ng trong kho畉ng th畛i gian time TIME time: h畛 th畛ng t畉m d畛ng trong kho畉ng th畛i gian time ch畛 ra V鱈 d畛: WAITFOR DELAY '00:00:02' SELECT EmployeeID FROM Northwind.dbo.Employees C畉u tr炭c i畛u 一鞄庄畛n
  • 28. L畛nh RAISERROR: ph叩t sinh l畛i c畛a ng動畛i d湛ng C炭 ph叩p RAISERROR ({msg_id | msg_str}{, severity, state} [WITH option[,...n]] Msg_id: L th担ng b叩o, 動畛c l動u trong b畉ng sysmessage. M達 th担ng b叩o c畛a ng動畛i d湛ng ph畉i b畉t 畉u t畛 tr棚n 50000 Msg_str: N畛i dung th担ng b叩o, t畛i a 400 k箪 t畛. 畛 truy畛n tham s畛 vo trong th担ng b叩o th狸 d湛ng d畉ng %<Lo畉i k箪 t畛> Lo畉i k箪 t畛 l d,I,o,x,X hay u L動u 箪: s畛 float, double, char kh担ng 動畛c h畛 tr畛 C畉u tr炭c i畛u 一鞄庄畛n
  • 29. L畛nh RAISERROR: ph叩t sinh l畛i c畛a ng動畛i d湛ng C叩c k箪 t畛 M担 t畉 d ho畉c I Bi畛u hi畛n l s畛 nguy棚n (integer) O Octal kh担ng d畉u P Con tr畛 S Chu畛i U S畛 nguy棚n kh担ng d畉u x or X Hexadecimal kh担ng d畉u C畉u tr炭c i畛u 一鞄庄畛n
  • 30. Severity Levels: M畛c l畛i c畛a m畛t th担ng b叩o l畛i cung c畉p m畛t s畛 bi畛u th畛 lo畉i v畉n 畛 m SQL Server g畉p ph畉i. M畛c l畛i 10 l l畛i v畛 th担ng tin v bi畛u th畛 nguy棚n nh但n do th担ng tin nh畉p vo. M畛c l畛i t畛 11 畉n 16 th狸 th担ng th動畛ng l do c叩c user. M畛c t畛 17 畉n 25 do l畛i ph畉n m畛m ho畉c ph畉n c畛ng. B畉n n棚n b叩o cho nh qu畉n tr畛 h畛 th畛ng b畉t c畛 khi no s畛 c畛 x畉y ra. Nh qu畉 tr畛 h畛 th畛ng ph畉i gi畉i quy畉t s畛 c畛 坦 v theo d探i ch炭ng th動畛ng xuy棚n. Khi m畛c l畛i 17,18,19 x畉y ra, b畉n c坦 th畛 ti畉p t畛c lm vi畛c, m畉c d湛 b畉n kh担ng th畛 th畛c thi l畛nh 畉c bi畛t. C畉u tr炭c i畛u 一鞄庄畛n
  • 31. M畛c l畛i 17: Nh畛ng th担ng b叩o ny cho bi畉t r畉ng c但u l畛nh SQL Server c畉n ki畛t ti nguy棚n (V鱈 d畛 nh動 lock ho畉c thi畉u kh担ng gian 挑a cho CSDL) ho畉c v動畛t qu叩 t畉p gi畛i h畉n b畛i nh qu畉n tr畛 Ng動畛i qu畉n tr畛 h畛 th畛ng n棚n gi叩m s叩t t畉t c畉 c叩c s畛 c畛 x畉y ra c坦 m畛c tr畉m tr畛ng t畛 17 畉n 25 v in ra gi畉i th鱈ch l畛i bao g畛m c叩c th担ng tin 畛 quay l畉i t畛 l畛i. M畛c l畛i t畛 20 畉n 25 ch畛 ra s畛 c畛 h畛 th畛ng. 坦 l l畛i kh担ng tr叩nh 動畛c, c坦 ngh挑a l ti畉n tr狸nh kh担ng c嘆n ang ch畉y. Ti畉n tr狸nh t棚 li畛t tr動畛c khi n坦 d畛ng, ghi nh畉n th担ng tin v畛 c叩i g狸 x畉y ra, v sau 坦 k畉t th炭c. C畉u tr炭c i畛u 一鞄庄畛n
  • 32. State: L m畛t s畛 nguy棚n t湛y 箪 t畛 1 畉n 127 m担 t畉 th担ng tin di畛n gi畉i v畛 tr畉ng th叩i l畛i. Argument: L tham s畛 d湛ng trong vi畛c thay th畉 cho bi畉n 畛 畛nh ngh挑a th担ng b叩o l畛i ho畉c th担ng b叩o t動董ng 畛ng v畛i m達 l畛i msg_id. C坦 th畛 kh担ng c坦 ho畉c c坦 nhi畛u tham s畛, tuy nhi棚n, kh担ng 動畛c qu叩 20. M畛i tham s畛 thay th畉 c坦 th畛 l m畛t bi畉n local ho畉c m畛t tr畛 b畉t k畛 trong c叩c ki畛u d畛 li畛u int, char, varchar, binary, varbinary. C叩c ki畛u kh叩c kh担ng 動畛c cung c畉p. C畉u tr炭c i畛u 一鞄庄畛n
  • 33. Th棚m m畛t th担ng b叩o l畛i m畛i do ng動畛i d湛ng 畛nh ngh挑a C炭 ph叩p: Sp_AddMessage msg_id, severity, msg[,language][,with_log][,replace] X坦a m畛t th担ng b叩o l畛i m畛i do ng動畛i d湛ng 畛nh ngh挑a Sp_DropMessage msg_id C畉u tr炭c i畛u 一鞄庄畛n C炭 ph叩p:
  • 34. msg_id: l m達 s畛 c畛a l畛i m畛i, l m畛t s畛 int, kh担ng 動畛c tr湛ng c叩c m達 達 c坦 s畉n, b畉t 畉u l 50001. severity: l m畛c nghi棚m tr畛ng c畛a l畛i, l m畛t s畛 smallint. M畛c h畛p l畛 l t畛 1 畉n 25. Ch畛 c坦 ng動畛i qu畉n tr畛 CSDL m畛i c坦 th畛 ph叩t sinh th棚m m畛t th担ng b叩o l畛i m畛i t畛 19 畉n 25. 'msg': l m畛t chu畛i th担ng b叩o l畛i, t畛i a 255 k箪 t畛. 'language': l ng担n ng畛 c畛a th担ng b叩o l畛i, m畉c 畛nh l ng担n ng畛 c畛a phi棚n k畉t n畛i. C畉u tr炭c i畛u 一鞄庄畛n
  • 35. 'with_log': th担ng b叩o l畛i c坦 動畛c ghi nh畉n vo nh畉t k箪 c畛a 畛ng d畛ng khi n坦 x畉y ra hay kh担ng, m畉c 畛nh l FALSE. N畉u l true, th狸 l畛i lu担n lu担n 動畛c ghi vo nh畉t k箪 畛ng d畛ng. Ch畛 c坦 nh畛ng thnh vi棚n c坦 vai tr嘆 sysadmin m畛i c坦 th畛 s畛 d畛ng tham s畛 ny. 'replace': n畉u 動畛c ch畛 畛nh chu畛i REPLACE, th狸 th担ng b叩o l畛i 達 t畛n t畉i 動畛c ghi 竪 b畛i chu畛i th担ng b叩o m畛i v m畛c l畛i m畛i. Tham s畛 ny ph畉i ch畛 畛nh n畉u msg_id 達 c坦. L動u 箪: n畉u tr畉 v畛 0 t畛c l th棚m vo thnh c担ng, tr畉 v畛 1 l th畉t b畉i. C畉u tr炭c i畛u 一鞄庄畛n
  • 36. sp_addmessage 50001,10,'Khong tim thay mau tin %d trong %ls' sp_addmessage 50002,16,'Khong xoa duoc %s vi %s co ton tai trong %ls' sp_addmessage 50003,16,'Mot lop chi co toi da %d hoc sinh' sp_addmessage 50004,16,'Don gia ban phai lon hon don gia goc' --xem thong bao loi vua xay dung use master sp_helptext sysmessages Select * From sysmessages Where error =50002 sp_dropmessage 50002 Select * From sysmessages V鱈 d畛: exec sp_... C畉u tr炭c i畛u 一鞄庄畛n
  • 37. --XAY DUNG CAU THONG BAO LOI BANG RAISERROR use Northwind RAISERROR (50001,10,1,4,'SANPHAM') DECLARE @@MA INT DECLARE @@TEN NVARCHAR SET @@TEN ='SANPHAM' SET @@MA =8 SELECT productid FROM products WHERE productid=@@MA IF (@@ROWCOUNT=0) BEGIN RAISERROR (50001,10,1,@@MA,@@TEN) END GO Ph叩t bi畛u RAISERROR
  • 38. Th畛 t畛c (Stored Procedure) Kh叩i ni畛m v畛 th畛 t畛c C叩c thao t叩c c董 b畉n v畛i th畛 t畛c Tham s畛 b棚n trong th畛 t畛c M畛t s畛 v畉n 畛 kh叩c trong th畛 t畛c 38
  • 39. Kh叩i ni畛m v畛 th畛 t畛c M畛t th畛 t畛c l m畛t 畛i t動畛ng trong c董 s畛 d畛 li畛u, bao g畛m m畛t t畉p nhi畛u c但u l畛nh SQL 動畛c nh坦m l畉i v畛i nhau thnh m畛t nh坦m v畛i nh畛ng kh畉 nng sau: C坦 th畛 bao g畛m c叩c c畉u tr炭c i畛u 一鞄庄畛n (IF, WHILE, FOR). B棚n trong th畛 t畛c l動u tr畛 c坦 th畛 s畛 d畛ng c叩c bi畉n nh畉m l動u gi畛 c叩c gi叩 tr畛 t鱈nh to叩n 動畛c, c叩c gi叩 tr畛 truy xu畉t 動畛c t畛 c董 s畛 d畛 li畛u.
  • 40. M畛t th畛 t畛c c坦 th畛 nh畉n c叩c tham s畛 truy畛n vo c滴ng nh動 c坦 th畛 tr畉 v畛 c叩c gi叩 tr畛 th担ng qua c叩c tham s畛. Khi m畛t th畛 t畛c l動u tr畛 達 動畛c 畛nh ngh挑a, n坦 c坦 th畛 動畛c g畛i th担ng qua t棚n th畛 t畛c, nh畉n c叩c tham s畛 truy畛n vo, th畛c thi c叩c c但u l畛nh SQL b棚n trong th畛 t畛c v c坦 th畛 tr畉 v畛 c叩c gi叩 tr畛 sau khi th畛c hi畛n xong. Kh叩i ni畛m v畛 th畛 t畛c
  • 41. Kh叩i ni畛m v畛 th畛 t畛c
  • 42. 董n gi畉n ho叩 c叩c thao t叩c tr棚n c董 s畛 d畛 li畛u nh畛 vo kh畉 nng module ho叩 c叩c thao t叩c ny. Th畛 t畛c l動u tr畛 動畛c ph但n t鱈ch, t畛i 動u khi t畉o ra; n棚n vi畛c th畛c thi ch炭ng nhanh h董n nhi畛u so v畛i vi畛c ph畉i th畛c hi畛n m畛t t畉p r畛i r畉c c叩c c但u l畛nh SQL t動董ng 動董ng theo c叩ch th担ng th動畛ng. Cho ph辿p th畛c hi畛n c湛ng m畛t y棚u c畉u b畉ng m畛t c但u l畛nh 董n gi畉n thay v狸 ph畉i s畛 d畛ng nhi畛u d嘆ng l畛nh SQL lm gi畉m thi畛u s畛 l動u th担ng tr棚n m畉ng. C坦 th畛 c畉p ph叩t quy畛n cho ng動畛i s畛 d畛ng th担ng qua c叩c th畛 t畛c l動u tr畛, nh畛 坦 tng kh畉 nng b畉o m畉t 畛i v畛i h畛 th畛ng. L畛i 鱈ch c畛a th畛 t畛c
  • 43. Ph但n lo畉i th畛 t畛c C叩c lo畉i Procedures User-defined System Temporary Remote Extended
  • 44. Sp = Stored procedure System sp: 動畛c l動u tr畛 trong CSDL master. C叩c th畛 t畛c c坦 t棚n b畉t 畉u l sp. Ch炭ng 坦ng vai tr嘆 kh叩c nhau c畛a c叩c t叩c v畛 動畛c cung c畉p trong SQL Server. Local sp: 動畛c l動u tr畛 trong c叩c CSDL ng動畛i d湛ng, n坦 th畛c thi c叩c t叩c v畛 trong CSDL ch畛a n坦. 動畛c ng動畛i s畛 d畛ng t畉o hay t畛 c叩c sp h畛 th畛ng. Ph但n lo畉i th畛 t畛c
  • 45. Temporary sp: gi畛ng local sp nh動ng n坦 ch畛 hi畛n h畛u cho 畉n khi k畉t n畛i t畉o ra n坦 b畛 坦ng. N坦 動畛c l動u trong CSDL TempDB. C坦 3 lo畉i temporary sp: Local (private), Global, sp t畉o tr畛c ti畉p trong TempDB. Extended sp: l m畛t th畛 t畛c 動畛c t畉o t畛 c叩c ng担n ng畛 l畉p tr狸nh kh叩c (kh担ng ph畉i SQL Server) v n坦 動畛c tri畛n khai t鱈nh nng c畛a m畛t th畛 t畛c trong SQL Server. C叩c th畛 t畛c ny c坦 t棚n b畉t 畉u l xp. Remote sp: l m畛t th畛 t畛c 動畛c g畛i th畛c thi t畛 m畛t server t畛 xa. Ph但n lo畉i th畛 t畛c
  • 46. V鱈 d畛 v畛 th畛 t畛c System stored procedures sp_stop_job sp_password sp_configure sp_help sp_helptext sp_start_job sp_tables sp_stored_procedures sp_server_info sp_databases
  • 47. System Store Procedure Description Sp_databases Lists all the databases available on the server. Sp_server_info Lists server information, such as, character set, version, and sort order. Sp_stored_procedures Lists all the stored procedures avaible in the current environment. Sp_tables Lists all the objects that can be queried in the current environment. Sp_start_job Starts an automated task immediately Sp_stop_job Stops an automated task that is running V鱈 d畛 v畛 th畛 t畛c
  • 48. System Store Procedure Description Sp_password Change the password for a login account Sp_configue Changes the SQL Server global configuration option. When used without options, display the current server settings. Sp_help Displays information about any database object. Sp_helptext Displays the actual text for a rule, a default, or an un-define function, trigger or view V鱈 d畛 v畛 th畛 t畛c
  • 49. User-defined Stored Procedures 動畛c t畉o b畛i ng動畛i s畛 d畛ng trong CSDL hi畛n hnh. C叩c th畛 t畛c c坦 th畛 動畛c t畉o tr動畛c c叩c 畛i t動畛ng m th畛 t畛c tham chi畉u 畉n. C叩ch 1 : D湛ng Enterprise Manager Right Click at Database, expand Programmability, expand Stored Procedures, then right click New Stored Procedure
  • 50. CREATE PROC [ EDURE ] procedure_name [ ; number ] [ { @parameter data_type } [ VARYING ] [ = default ] [ OUTPUT ] ] [,...n ] [ WITH { RECOMPILE | ENCRYPTION | RECOMPILE, ENCRYPTION } ] [ FOR REPLICATION ] AS sql_statement [ ...n ] Ki畛m tra s畛 t畛n t畉i c畛a th畛 t畛c: sp_helptext Procedure_name sp_help Procedure_name sp_depends Procedure_name sp_stored_procedures C叩ch 2 : D湛ng ph叩t bi畛u CREATE PROCEDURE User-defined Stored Procedures
  • 51. User-defined Stored Procedures RECOMPILE: Th担ng th動畛ng, th畛 t畛c s畉 動畛c ph但n t鱈ch, t畛i 動u v d畛ch s畉n 畛 l畉n g畛i 畉u ti棚n. N畉u tu畛 ch畛n WITH RECOMPILE 動畛c ch畛 畛nh, th畛 t畛c s畉 動畛c d畛ch l畉i m畛i khi 動畛c g畛i. ENCRYPTION: Th畛 t畛c s畉 動畛c m達 ho叩 n畉u tu畛 ch畛n WITH ENCRYPTION 動畛c ch畛 畛nh. N畉u th畛 t畛c 達 動畛c m達 ho叩, ta kh担ng th畛 xem 動畛c n畛i dung c畛a th畛 t畛c.
  • 52. VD: Th畛 t畛c kh担ng c坦 tham s畛 CREATE PROC Tong as Declare @a int, @b int Set @a =7 Set @b =3 Print 'Tong = '+convert(varchar(10),@a+@b) Print 'Hieu = '+convert(varchar(10),@a-@b) Print 'Tich = '+convert(varchar(10),@a*@b) If @b<>0 Print 'Thuong = '+convert(varchar(10),@a/@b) Else Print 'Khong chia duoc' --Thuc thi EXEC Tong User-defined Stored Procedures
  • 53. VD: Th畛 t畛c c坦 tham s畛 CREATE PROC Tong1(@a int, @b int) as Print 'Tong = '+convert(varchar(10),@a+@b) Print 'Hieu = '+convert(varchar(10),@a-@b) Print 'Tich = '+convert(varchar(10),@a*@b) If @b<>0 Print 'Thuong ='+convert(varchar(10),@a/@b) Else Print 'Khong chia duoc' --Th畛c thi EXEC Tong1 5,7 User-defined Stored Procedures
  • 54. User-defined Stored Procedures CREATE PROCEDURE London_KH AS SELECT * FROM Customers WHERE City= 'London' --Thuc thi Exec LonDon_KH CREATE PROCEDURE TP_KH (@TP nvarchar(15)) AS SELECT * FROM Customers WHERE City=@TP --Thuc thi Exec TP_KH 'London' V鱈 d畛
  • 55. Th畛c thi m畛t Stored Procedure C炭 ph叩p: [ EXEC [ UTE ] ] { [ @return_status = ] { procedure_name [ ;number ] | @procedure_name_var } [ [ @parameter = ] { value | @variable [ OUTPUT ] | [ DEFAULT ] ] [ ,...n ] [ WITH RECOMPILE ] V鱈 d畛 1: EXECUTE TP_KH 'London' GO EXECUTE TP_KH 'Paris' GO DECLARE @City nvarchar(15), @Return_Value tinyint SET @City='LonDon' EXECUTE @Return_Value=TP_KH @City PRINT @Return_Value GO
  • 56. S畛 d畛ng tham s畛 C坦 2 lo畉i tham s畛: Input parameter: tham s畛 nh畉p, 動a gi叩 tr畛 c畛a tham s畛 畛 th担ng b叩o cho th畛 t畛c n棚n lm g狸 trong CSDL Output parameter: tham s畛 xu畉t ch畛a gi叩 tr畛 tr畉 v畛 c畛a th畛 t畛c. Khai b叩o tham s畛: {@parameter data_type} [= default|NULL][varying] [OUTPUT]
  • 57. C炭 ph叩p CREATE PROCEDURE procedure_name @Parameter_name data_type AS .... S畛 d畛ng tham s畛
  • 58. T畉o th畛 t畛c v畛i tham s畛 CREATE PROCEDURE city_KH @KH_city varchar(15) AS SELECT * FROM Customers WHERE City = @KH_city V鱈 d畛 Th畛c thi th畛 t畛c: Exec city_KH 'London'
  • 59. V鱈 d畛: CREATE PROC prcListCustomer @City char(15) AS BEGIN PRINT 'List of Customers' SELECT CustomerID,CompanyName,Address,Phone FROM Customers WHERE City = @City END EXEC prcListCustomer 'LonDon' T畉o th畛 t畛c v畛i tham s畛
  • 60. V鱈 d畛: CREATE PROCEDURE CustOrderHist @CustomerID nchar(5) AS SELECT ProductName, Total=SUM(Quantity) FROM Products P, [Order Details] OD, Orders O, Customers C WHERE C.CustomerID = @CustomerID AND C.CustomerID = O.CustomerID AND O.OrderID = OD.OrderID AND OD.ProductID = P.ProductID GROUP BY ProductName Exec CustOrderHist 'NORTS' T畉o th畛 t畛c v畛i tham s畛
  • 61. Th畛 t畛c c坦 tr畛 tr畉 v畛 Tr畛 tr畉 v畛 l gi叩 tr畛 ki畛u integer. M畉c 畛nh gi叩 tr畛 tr畉 v畛 l 0 C炭 ph叩p DECLARE @return_variable_name data_type EXECUTE @return_variable_name = procedure_name
  • 62. VD: CREATE PROC Tinhtoan @a int, @b int , @tong int output, @hieu int output, @tich int output, @thuong real output as Begin Set @tong =@a +@b Set @hieu = @a -@b Set @tich = @a *@b if @b<>0 begin Set @thuong = @a/@b Print 'Thuong = '+convert(varchar(10),@thuong) end Else Print 'Khong chia duoc' Set @b = @b *100 End V鱈 d畛 t畉o th畛 t畛c c坦 gi叩 tr畛 tr畉 v畛
  • 63. --Th畛c thi: Declare @tong int, @hieu int, @tich int, @thuong real, @a int, @b int Set @a= 8 Set @b=5 Print 'a = '+convert(varchar(10),@a) Print 'b = '+convert(varchar(10),@b) EXEC tinhtoan @a, @b, @tong OUTPUT,@hieu OUTPUT, @tich output, @thuong output Print 'a = '+convert(varchar(10),@a) Print 'b = '+convert(varchar(10),@b) Print 'Tong = '+convert(varchar(10),@tong) Print 'Hieu = '+convert(varchar(10),@hieu) Print 'Tich = '+convert(varchar(10),@tich) Print 'Thuong = '+convert(varchar(10),@thuong) Go V鱈 d畛 t畉o th畛 t畛c c坦 gi叩 tr畛 tr畉 v畛
  • 64. VD: CREATE PROCEDURE prcGetUnitPrice_UnitsInStock @ProductID int, @Unitprice Money OUTPUT, @UnitsInStock smallint OUTPUT AS BEGIN IF EXISTS (SELECT * FROM Products WHERE ProductID = @ProductID) BEGIN SELECT @Unitprice=Unitprice,@UnitsInStock=UnitsInStock FROM Products WHERE ProductID=@ProductID RETURN 0 END ELSE RETURN 1 END V鱈 d畛 t畉o th畛 t畛c c坦 gi叩 tr畛 tr畉 v畛
  • 65. --Th畛c thi: Declare @Unitprice Money, @UnitsInStock smallint EXEC prcGetUnitPrice_UnitsInStock 1, @Unitprice OUTPUT, @UnitsInStock OUTPUT Select @Unitprice AS Gia, @UnitsInStock AS SoLuongTon V鱈 d畛 t畉o th畛 t畛c c坦 gi叩 tr畛 tr畉 v畛
  • 66. CREATE PROCEDURE KH_city @KH_city VARCHAR(15) AS DECLARE @KH_return int SELECT @KH_return=COUNT(*) FROM CUSTOMERS WHERE City = @KH_city RETURN @KH_return+1 --Thuc thi Declare @SoKH int EXEC @SoKH=KH_city 'LonDon' Print 'So KH la '+convert(varchar(4),@SoKH) V鱈 d畛 V鱈 d畛 t畉o th畛 t畛c c坦 gi叩 tr畛 tr畉 v畛
  • 67. VD: CREATE PROCEDURE prcDisplayUnitPrice_UnitsInStock @ProductID int AS BEGIN DECLARE @UnitPrice Money, @UnitsInStock smallint DECLARE @ReturnValue Tinyint EXEC @ReturnValue = prcGetUnitPrice_UnitSInStock @ProductID, @UnitPrice output, @UnitsInStock output IF (@ReturnValue = 0) BEGIN PRINT 'The Status for product: '+ Convert(char(10), @ProductID) PRINT 'Unit price : ' + CONVERT( char(10), @Unitprice) PRINT 'Current Units In Stock:' + CONVERT (char(10), @UnitsInStock) END ELSE PRINT 'No records for the given productID ' + Convert(char(10), @ProductID) END V鱈 d畛 t畉o th畛 t畛c c坦 gi叩 tr畛 tr畉 v畛
  • 68. --Th畛c thi: EXECUTE prcDisplayUnitPrice_UnitsInStock 1222 GO EXECUTE prcDisplayUnitPrice_UnitsInStock 1 V鱈 d畛 t畉o th畛 t畛c c坦 gi叩 tr畛 tr畉 v畛
  • 69. S畛a m畛t th畛 t畛c - Stored Procedure ALTER PROCEDURE KH_city AS SELECT * FROM dbo.Customers; Exec KH_city
  • 70. S畛a m畛t th畛 t畛c - Stored Procedure Example: ALTER PROC prcListCustomer @City char(15)=NULL AS BEGIN IF @city is NULL BEGIN PRINT 'Usage: prcListCustomer <City>' RETURN END PRINT 'List of Customers' SELECT CustomerID,CompanyName,Address,Phone FROM Customers WHERE City = @City END
  • 71. VD: ALTER PROC prcListCustomer @City char(15) AS BEGIN IF EXISTS (SELECT * FROM Customers WHERE City=@city) BEGIN PRINT 'List of Customers' SELECT CustomerID,CompanyName,Address,Phone FROM Customers WHERE City = @City RETURN 0 END ELSE BEGIN PRINT 'No Records Found for given city' RETURN 1 END END S畛a m畛t th畛 t畛c - Stored Procedure
  • 72. X坦a m畛t Stored Procedure DROP PROCEDURE proc_name V鱈 d畛: DROP PROCEDURE City_KH
  • 73. HM (Function) Kh叩i ni畛m v畛 Hm C叩c lo畉i hm C叩c lo畉i gi叩 tr畛 tr畉 v畛 c畛a UDFs T畉o v qu畉n l箪 hm UDFs Scalar Function Table-valued Function S畛 d畛ng hm UDFs
  • 74. Kh叩i ni畛m v畛 Hm Hm t動董ng t畛 th畛 t畛c bao g畛m c叩c ph叩t bi畛u T-SQL v m畛t s畛 c畉u tr炭c i畛u 一鞄庄畛n 動畛c l動u v畛i m畛t t棚n v 動畛c x畛 l箪 nh動 m畛t 董n v畛 畛c l畉p. Hm 動畛c bi棚n d畛ch tr動畛c, kh担ng c畉n ki畛m tra v bi棚n d畛ch l畉i. i畛m kh叩c bi畛t gi畛a hm v th畛 t畛c l hm tr畉 v畛 m畛t gi叩 tr畛 th担ng qua t棚n hm c嘆n th畛 t畛c th狸 kh担ng.
  • 75. Kh叩i ni畛m v畛 Hm Hm 動畛c d湛ng trong: L畛nh Print hay l畛nh Select 畛 hi畛n th畛 gi叩 tr畛 tr畉 v畛 c畛a hm. Danh s叩ch ch畛n c畛a m畛t c但u l畛nh Select 畛 cho ra m畛t gi叩 tr畛. M畛t i畛u ki畛n t狸m ki畉m c畛a m畛nh 畛 Where trong c叩c c但u l畛nh T-SQL.
  • 76. 働u i畛m c畛a Hm Ng動畛i g畛i ch畛 g畛i m畛t c但u l畛nh 董n v SQL Server ch畛 ki畛m tra m畛t l畉n sau 坦 t畉o ra m畛t execute plan v th畛c thi. C炭 ph叩p c畛a c叩c c但u l畛nh SQL 達 動畛c SQL Sever ki畛m tra tr動畛c khi save n棚n n坦 kh担ng c畉n ki畛m l畉i khi th畛c thigi畉m ngh畉n m畉ng B畉o tr狸 (maintainability) d畛 dng h董n do vi畛c t叩ch r畛i gi畛a business rules v database. N畉u c坦 m畛t s畛 thay 畛i no 坦 v畛 m畉t logic th狸 ta ch畛 vi畛c thay 畛i code b棚n trong hm m th担i Security: c坦 th畛 動畛c encrypt (m達 h坦a) 畛 tng c動畛ng t鱈nh b畉o m畉t.
  • 77. C叩c lo畉i Hm C坦 hai lo畉i: Built-in functions: Ho畉t 畛ng nh動 l m畛t 畛nh ngh挑a trong T-SQL v kh担ng th畛 hi畛u ch畛nh. Ch畛 動畛c tham chi畉u trong c叩c c但u l畛nh T-SQL. Tr畛 tr畉 v畛 l m畛t t畉p c叩c d嘆ng(Rowset), v担 h動畛ng(scalar) v aggregate(th畛ng k棚). User-define functions hay c嘆n g畛i l UDFs: do ng動畛i d湛ng t畛 畛nh ngh挑a 畛 叩p 畛ng m畛t m畛c ti棚u no 坦. C叩c tham s畛 truy畛n vo kh担ng 動畛c mang thu畛c t鱈nh OUTPUT, do 坦 gi叩 tr畛 tr畉 v畛 cho hm b畉ng ph叩t bi畛u RETURN. Gi叩 tr畛 tr畉 v畛 l gi叩 tr畛 v担 h動畛ng (Scalar valued) hay b畉ng (Table valued).
  • 78. C叩c lo畉i gi叩 tr畛 tr畉 v畛 c畛a UDFs Scalar Function: M畛t hm v担 h動畛ng tr畉 v畛 m畛t gi叩 tr畛 董n v c坦 th畛 動畛c d湛ng b畉t c畛 n董i no c畛a bi畛u th畛c hay c坦 th畛 動畛c d湛ng c但u l畛nh SELECT, m畛nh 畛 SET c畛a l畛nh UPDATE,... M畛t hm v担 h動畛ng c坦 th畛 動畛c xem nh動 k畉t qu畉 c畛a vi ph辿p to叩n hay hm chu畛i. Table-valued Function : M畛t hm c坦 gi叩 tr畛 tr畉 v畛 l m畛t t畉p k畉t qu畉 v c坦 th畛 動畛c d湛ng b畉t c畛 n董i no m b畉ng hay view 動畛c d湛ng. Hm gi叩 tr畛 b畉ng c坦 th畛 動畛c tham chi畉u trong m畛nh 畛 FROM c畛a c但u l畛nh SELECT. T棚n v nh畛ng th担ng tin v畛 Function khi 動畛c t畉o ra s畉 ch畛a trong SysObjects table c嘆n ph畉n text c畛a n坦 ch畛a trong SysComments table.
  • 79. C叩c l畛nh t畉o v qu畉n l箪 UDF T畉o Hm CREATE FUNCTION <TenHam> S畛a Hm ALTER FUNCTION <TenHam> X坦a Hm DROP FUNCTION statement Th畛c thi Hm D湛ng l畛nh Print D湛ng L畛nh Select Xem c叩c l畛nh c畛a UDFs Sp_helptext TenHam
  • 80. Scalar Function 1. Scalar Function Kh担ng c坦 tham s畛 L hm kh担ng nh畉n gi叩 tr畛 t畛 b棚n ngoi truy畛n vo. C炭 ph叩p: CREATE FUNCTION [Owner_name.]function_name RETURNS scalar_return_data_type [WITH { ENCRYPTION | SCHEMABINDING } ] [ AS ] BEGIN function_body RETURN scalar_expression END
  • 81. V鱈 d畛 1 : Hm tr畉 v畛 t畛ng 2 s畛 4 v 6 Create Function tong2so() Returns int as Begin Declare @so1 int, @so2 int Set @so1 = 4 Set @so2 =6 Return @so1+@so2 End --thuc hien Print 'Tong = ' +convert(char(10),dbo.tong2so()) Select dbo.tong2so() as Tong Scalar Function T畉o Hm
  • 82. Alter Function tong2so() Returns int With Encryption as Begin Declare @so1 int, @so2 int Set @so1 = 4 set @so2 =6 Return @so1+@so2 End --Xem l畛nh sp_helptext tong2so --Th畛c hi畛n print 'Tong = ' +convert(char(10),dbo.tong2so()) select dbo.tong2so() as Tong --X坦a hm Drop function Tong2so Scalar Function S畛a v X坦a Hm
  • 83. V鱈 d畛 2 : Hm tr畉 v畛 t畛ng ti畛n c畛a kh叩ch hng c坦 m達 l TOMSP Create function Tongtien() Returns money AS Begin Declare @tong money Select @tong = sum(unitprice*Quantity) from orders o, [Order Details] d where o.orderid = d.orderid and customerid = 'TOMSP' Return @tong End print 'Tong = ' +convert(char(10),dbo.tongtien()) select dbo.tongtien() as [Tong Tien Cua Khach Hang TOMSP] Scalar Function
  • 84. 2. Scalar Function C坦 tham s畛 L hm nh畉n c叩c gi叩 tr畛 t畛 b棚n ngoi truy畛n vo. C炭 ph叩p: CREATE FUNCTION [owner_name.]function_name ([{@parameter_name [AS] data_type [=default]} [ ,n ]]) RETURNS scalar_return_data_type [WITH { ENCRYPTION | SCHEMABINDING } ] [ AS ] BEGIN function_body RETURN scalar_expression END Scalar Function
  • 85. V鱈 d畛 : Hm tr畉 v畛 t畛ng c畛a hai s畛 b畉t k畛 Create function tong(@so1 int, @so2 int) Returns int as Begin Return @so1+@so2 End -- Thuc hien ham Declare @a int, @b int Set @a = 4 Set @b =6 Print 'Tong cua '+convert(char(5),@a) +' '+ convert(char(5),@b)+'='+convert(char(5),dbo.tong(@a,@b)) Select dbo.tong(@a,@b) as tong Scalar Function
  • 86. VD: Hm tr畉 v畛 t畛ng ti畛n c畛a kh叩ch hng no 坦 Create function TongtienTS(@makh nchar(5)) Returns money AS Begin Declare @tong money Select @tong = sum(unitprice*Quantity) From orders o, [Order Details] d Where o.orderid = d.orderid and customerid = @makh Return @tong End Declare @ma nchar(5) Set @ma = 'TOMSP' Print 'Tong = ' +convert(char(10),dbo.tongtients(@ma)) Select dbo.tongtients(@ma) as Tong Scalar Function
  • 87. Bi t畉p 叩p d畛ng : Hm tr畉 v畛 th畛 b畉ng ti畉ng Vi畛t Create function thu(@ngay datetime) Returns varChar(10) As Begin Declare @t varchar(10), @d tinyint Set @d = datepart(dw,@ngay) Set @t = case When @d = 1 then 'Chu Nhat' When @d = 2 then 'Hai' When @d = 3 then 'Ba' When @d = 4 then 'Tu' When @d = 5 then 'Nam' When @d = 6 then 'Sau' When @d = 7 then 'Bay' end Return @t End Scalar Function
  • 88. --Th畛c thi Declare @ngaysinh datetime Set @ngaysinh = getdate() Print 'Ban sinh vao Thu '+dbo.thu(@ngaysinh) + ' Ngay '+ convert(char(3),day(@ngaysinh)) + ' thang ' + Convert(char(3), month(@ngaysinh))+' nam ' +convert(char(5),year(@ngaysinh)) --Thuc hien voi cau lenh Select Select employeeid, LastName +' '+FirstName as Hoten, thu = dbo.thu(birthdate) from Employees Select employeeid, LastName +' '+FirstName as Hoten, [Thu Ngay Thang Nam Sinh] ='Thu '+dbo.thu(birthdate) +' Ngay '+ convert(char(2),day(birthdate)) + ' thang ' + Convert(char(2), month(birthdate))+ ' nam ' +convert(char(4),year(birthdate)) from Employees Scalar Function
  • 89. BT2 : Hm tr畉 v畛 T畛ng ti畛n c畛a c叩c s畉n ph畉m Create function TotalAmount (@Unitprice money, @quantity Smallint,@Discount real) Returns Money As Begin Return (@Unitprice * @Quantity)*(1-@discount) End --Su dung Select Productid, Total = dbo.TotalAmount(Unitprice,Quantity,Discount) From [Order Details] Where Orderid =10250 Scalar Function
  • 90. BT t畛 lm: Vi畉t hm tr畉 v畛 chi畉t kh畉u c畛a s畉n ph畉m d畛a vo s畛 l動畛ng l畉p ho叩 董n v theo quy 畛nh sau: -N畉u s畛 l動畛ng <=5 th狸 chi畉t kh畉u l 0.05 -N畉u s畛 l動畛ng t畛 6 畉n 10 th狸 chi畉t kh畉u 0.07 -N畉u s畛 l動畛ng t畛 11 畉n 20 th狸 chi畉t kh畉u l 0.09 ng動畛c l畉i th狸 chi畉t kh畉u l 0.1 Scalar Function
  • 91. The table-valued UDFs The table-valued UDFs: 動畛c chia thnh hai lo畉i l inline v multistatement table-valued. Inline table-valued UDF: 動畛c xem nh動 l m畛t View c坦 tham s畛. Th畛c thi m畛t c但u l畛nh Select nh動 trong m畛t view nh動ng c坦 th畛 bao g畛m c叩c tham s畛 gi畛ng th畛 t畛c C炭 ph叩p: CREATE FUNCTION [owner_name.]function_name ([{@parameter_name [AS] data_type [=default]} [ ,n ]]) RETURNS TABLE [WITH { ENCRYPTION | SCHEMABINDING }] [AS] RETURN [(] select-statement [)]
  • 92. The table-valued UDFs V鱈 d畛 1: Cho bi畉t t畛ng s畛 h坦a 董n c畛a kh叩ch hng b畉t k畛. CREATE FUNCTION CountOrderCust (@cust varchar(5)) RETURNS TABLE AS RETURN (Select CustomerID, count(orderid) as countOrder From orders Where customerID like @cust Group by customerID ) Thi hnh (kh担ng c畉n t棚n 畉y 畛) Select * From CountOrderCust('A%' ) Declare @ma nvarchar(5) Set @ma='A%' Select * from CountOrderCust(@ma)
  • 93. The table-valued UDFs V鱈 d畛 2 : tr畉 v畛 t畛ng s畛 l動畛ng c畛a t畛ng s畉n ph畉m theo lo畉i hng no 坦. CREATE FUNCTION SalesByCategory(@Categoryid Int) RETURNS TABLE AS RETURN (SELECT c.CategoryName, P. ProductName, SUM(Quantity) AS TotalQty FROM Categories c INNER JOIN Products p ON c.CategoryID= p. CategoryID INNER JOIN [Order Details] od ON p.ProductID = od.ProductID WHERE c.CategoryID= @Categoryid GROUP BY c. CategoryName,p.ProductName) Th畛c thi SELECT * FROM SalesByCategory (1)
  • 94. The table-valued UDFs Multistatement Table-valued UDF: l d畉ng ph畛c t畉p nh畉t. Lo畉i hm ny x但y d畛ng t畉p k畉t qu畉 t畛 m畛t hay nhi畛u c但u l畛nh Select C炭 ph叩p: CREATE FUNCTION [owner_name.]function_name ([{@parameter_name [AS] data_type [=default]} [ ,n ]]) RETURNS @return_variable TABLE ({column_definition | table_constraint} [ ,n ]) [WITH { ENCRYPTION | SCHEMABINDING } ] [AS] BEGIN function_body RETURN END
  • 95. The table-valued UDFs V鱈 d畛 1 CREATE FUNCTION CountOrderCust() RETURNS @fn_CountOrderCust TABLE (OrderIdent tinyint Not null, Cust varchar(5) ) AS Begin Insert @fn_CountOrderCust Select Count(orderid),CustomerId From Orders Group by Customerid Return End --Thi hnh Select * From CountOrderCust()
  • 96. The table-valued UDFs V鱈 d畛 2 CREATE FUNCTION Contacts(@suppliers bit=0) RETURNS @Contacts TABLE (ContactName nvarchar(30), Phone nvarchar(24), ContactType nvarchar(15)) AS BEGIN INSERT @Contacts SELECT ContactName, Phone, 'Customer' FROM Customers INSERT @Contacts SELECT FirstName + ' ' + LastName, HomePhone, 'Employee' FROM Employees IF @Suppliers=1 INSERT @Contacts SELECT ContactName, Phone, 'Supplier' FROM Suppliers RETURN END -- Th畛c thi SELECT * FROM CONTACTS(1) ORDER BY ContactName
  • 97. S畛 d畛ng UDFs Scalar UDF: khi g畛i lu担n lu担n theo c炭 ph叩p: owner.functionname. V鱈 d畛: SELECT ProductID, Total=dbo.TotalAmount(UnitPrice, Quantity, Discount) FROM [Order details] WHERE OrderID=10250 Scalar UDF c坦 th畛 動畛c s畛 d畛ng trong bi畛u th畛c, trong c但u l畛nh SELECT hay l畛nh CREATE TABLE CREATE TABLE [Order Details] ( OrderID int NOT NULL , ProductID int NOT NULL , UnitPrice money NOT NULL DEFAULT (0), Quantity smallint NOT NULL DEFAULT (1), Discount real NOT NULL DEFAULT (0), Total AS dbo.TotalAmount(UnitPrice, Quantity, Discount))
  • 98. S畛 d畛ng UDFs A table-valued UDF: C坦 th畛 動畛c g畛i theo c炭 ph叩p owner.functionname hay functionname SELECT * FROM Contacts(1) ORDER BY ContactName N畉u table-valued function kh担ng c坦 tham s畛, b畉n ph畉i s畛 d畛ng d畉u() N畉u tham s畛 c坦 gi叩 tr畛 m畉c 畛nh, b畉n ph畉i truy畛n gi叩 tr畛 vo m畉c d湛 b畉n c坦 s畛 d畛ng t畛 kh坦a DEFAULT SELECT * FROM Contacts() ORDER BY ContactName
  • 99. S畛 d畛ng UDFs Bi t畉p t畛 lm: Vi畉t hm tr畉 v畛 danh s叩ch c叩c ho叩 董n 達 l畉p c畛a m畛t kh叩ch hng no 坦 trong m畛t th叩ng nm no 坦. Th担ng tin g畛m: Makh, TenKh, Diachi, mahd, ngaylapHD, Noichuyen, LoaiHD. Trong 坦, LoaiHD 動畛c hi畛n th畛 r探 l Nh畉p ho畉c Xu畉t.