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
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
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
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
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畛
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畛
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畛
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
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.