Batch và Script Batch là một tập hợp các lệnh tạo thành một nhóm và được xem như một đơn vị thực thi Các lệnh Create phải được đặt trong một batch đơn Script là 1 chuỗi các batch đ
Trang 1Chương 7
Lập trình T_SQL
Trang 3 Cấu trúc điều khiển if, while
Khối lệnh begin … end
Trang 4Batch và Script
Batch là một tập hợp các lệnh tạo thành một
nhóm và được xem như một đơn vị thực thi
Các lệnh Create phải được đặt trong một batch đơn
Script là 1 chuỗi các batch được kết hợp và
lưu trữ trong cùng 1 file
Lệnh GO được dùng để xác định việc kết thúc của 1 batch bên trong 1 script.
File sql
Trang 5Batch và Script
USE QLSach
GO /* đánh dấu kết thúc batch thứ 1*/ CREATE VIEW vwNhanvien AS
SELECT * FROM Nhanvien
GO /* đánh dấu kết thúc batch thứ 2 */ SELECT * FROM vwNhanvien
GO /* đánh dấu kết thúc batch thứ 3 */
Trang 7Biến cục bộ
Tên biến bắt đầu bằng @
Phạm vi hoạt động của biến : bắt đầu từ vị trí khai báo đến khi kết thúc batch, hay kết thúc procedure, function
Khai báo biến
DECLARE @variable_name data_type
Có thể khai báo nhiều biến trong một lệnh declare
Trang 8Biến cục bộ
Gán giá trị vào biến: 2 cách
VD1
DECLARE @Charge int //khai báo biến
SET @Charge = 10 //gán biến
VD2
DECLARE @SL int //khai báo biến
SELECT @SL = Sum(SoLuong) // gán biến
From HangHoa Where Year(NgayNhap) = 2004
VD3
DECLARE @SL int
Trang 9Biến cục bộ
Gán giá trị vào biến: 2 cách
VD4
DECLARE @SL int //khai báo biến
SELECT @SL = SoLuong // gán biến
From HangHoa
VD4
DECLARE @a int, @b int //khai báo nhiều biếnSELECT @a = 10 , @b = 100 //gán nhiều biến
Trang 12Cấu trúc điều khiển
Cấu trúc if …else
Cấu trúc while
Biểu thức Case
Trang 14Cấu trúc if (tt)
VD2
if (select avg(year(ngaysinh)) from nhanvien) <=35
print ‘young leaders’
else
print ‘old leaders’
Trang 15Cấu trúc if (tt)
VD3
Declare @masach char(5), @dgnew float
Set @masach = ‘S0001’
if (Select slton from dmsach where masach = @masach) >=100
Select @dgnew = dongia*0.7
from dmsach where masach = @masach
else
if (Select slton from dmsach where masach = @masach) >=50
Select @dgnew = dongia*0.8 from dmsach where masach = @masach
else
Select @dgnew = dongia*0.9 from dmsach where masach = @masach
Trang 18Case (tt)
VD2.a : dạng 1 của CASE
Select (case phai
when ‘nam’ then ‘Mr ’ when ‘nữ’ then ‘Mrs ’
end ) + Hoten From Nhanvien
Trang 20Case (tt)
VD3
select case
when (select avg(soluong) from CTHD)>100
then ‘không khuyến mãi’
when (select avg(soluong) from CTHD)>40
then ‘cần khuyến mãi’
else ‘cần hỗ trợ vốn'
end
Có thể sử dụng biến trung gian
Trang 21SET price = price * 2
SELECT MAX(price) FROM titles
IF (SELECT MAX(price) FROM titles) > $50
BREAK
ELSE
CONTINUE
END
Trang 23Lợi ích
Dùng thủ tục (stored procedure) trong SQL Server tốt hơn dùng các chương trình T-SQL được lưu trữ trên client:
Cho phép lập trình thủ tục
có thể tạo thủ tục 1 lần, lưu trữ nó trong database, và gọi nó bất kỳ lúc nào cần dùng trong chương trình.
Cho phép thực thi nhanh hơn
Có thể giảm lưu lượng mạng
Có thể được dùng như cơ chế bảo mật
Trang 24Thủ tục - Store procedure
Gồm các loại
System Store Procedure
Lưu trong Master DB
Có tên bắt đầu sp_
Thực hiện các tác vụ hệ thống
User Defined Store Procedure
Lưu trữ trong DB của người dùng
Temporary Store Procedure
Lưu trữ trong Tempdb DB
Trang 25System Store Procedure
Một số System Store Procedure
Trang 26User Defined Store Procedure
Trang 27User Defined Store Procedure
Trang 28User Defined Store Procedure
Trang 29User Defined Store Procedure
Trang 30Sử dụng tham số trong thủ tục
Sử dụng tham số vào
VD2:
Create proc nhan2so
@so1 int, @so2 int
As
Print @so1*@so2
Go
Exec nhan2so 5, 10 //xuất ra 50
Trang 31Sử dụng tham số trong thủ tục
Khai báo giá trị default của tham số vào
Create proc nhan2so
@so1 int = 1, @so2 int = 1
As
Print @so1*@so2
Go
Exec nhan2so 5, 10 //xuất ra 50
Exec nhan2so //xuất ra 1
Trang 32Sử dụng tham số trong thủ tục
Sử dụng tham số ra để trả về giá trị
Create proc nhan2so
@so1 int , @so2 int , @kq int OUTPUT
As
Set @kq= @so1*@so2
Go
Declare @ketqua int
Exec nhan2so 5, 10 , @ketqua OUTPUT
Print @ketqua
Trang 33Sử dụng return trong thủ tục
Sử dụng lệnh return để trả về giá trị
Create proc nhan2so
@so1 int , @so2 int
As
Return @so1*@so2
Go
Declare @ketqua int
Exec @ketqua = nhan2so 5, 10
Print @ketqua
Trang 34Bài tập 1
Viết thủ tục chèn dữ liệu vào bảng Sach
Create proc insSach
@Masach char(5), @tensach varchar(50), @tacgia varchar(50), @manhom char(5), @dongia int,
@slton int
As
Insert into sach
Values(@Masach, @tensach, @tacgia, @manhom,
@dongia, @slton)
Go
Trang 35Bài tập 1
Create proc insSach
@Masach char(5), @tensach varchar(50), @tacgia varchar(50),
@manhom char(5), @dongia int, @slton int
As
Insert into sach
Values(@Masach, @tensach, @tacgia, @manhom, @dongia, @slton) Return @@error //trả về mã lỗi
Go
declare @err int
exec @err = insSach 's100', 'aaa', 'bbb', 'n001', 100, 20
print @err
Trang 36Hàm _ functions
Chức năng
Trả về một giá trị, hay một tập row
Không sử dụng tham số ra => trả về giá trị bằng lệnh return
Có 3 loại
– Scalar function : Trả về một giá trị đơn
– Inline Table-valued :Sử dụng một câu lệnh Select để trả về một tập row
– Multi-statement Table-valued : Sử dụng nhiều câu lệnh để trả về một tập row
Trang 37Scalar functions
Định nghĩa Scalar function
CREATE FUNCTION nhan(@so1 int, @so2 int) RETURNS int
Trang 38Inline Table_value Function
Sử dụng để tạo một view có tham số
CREATE FUNCTION nhomsach(@manhom char(5))RETURNS TABLE
Trang 39Multistatement table_value
function
Sử dụng để tạo tập dữ liệu
Cho phép nhiều câu lệnh trong thân hàm
CREATE FUNCTION Loaisach()
RETURNS @tapkq TABLE(maso char(5), ten
varchar(40) ) as
BEGIN
insert @tapkq select * from nhomsach
insert @tapkq select * from nhomsach
Trang 40Bài tập 2
Xây dựng thủ tục , hàm để thực hiện cùng chức năng với truy vấn sau
Select Mahd, c.Masach, soluong, dongia, chietkhau = case
(when soluong <5 then 0.05*dongia
when soluong <10 then 0.06*dongia
when soluong <15 then 0.08*dongia
else 0.1*dongia
end )
From Sach s, Chitiethoadon c
Where s.masach = c.masach
Trang 41when soluong <10 then 0.06*dongia
when soluong <15 then 0.08*dongia
else 0.1*dongia
end )
From Sach s, Chitiethoadon c
Where s.masach = c.masach
Trang 42Bài tập 2
Phương án 2
Create proc chitiethd
@m1 int, @dg1 float, @m2 int, @dg2 float, @m3 int, @dg3 float, @dg4 float
as
Select Mahd, c.Masach, soluong, dongia, chietkhau = case
(when soluong <@m1 then @dg1 *dongia
when soluong <@m2 then @dg2 *dongia
when soluong <@m3 then @dg3 *dongia
else @dg4 *dongia
end )
From Sach s, Chitiethoadon c
Where s.masach = c.masach
Trang 43Bài tập 2
Phương án 3
Create proc chitiethd
@m1 int, @dg1 float, @m2 int, @dg2 float, @m3 int, @dg3 float, @dg4 float
as
Select Mahd, c.Masach, soluong, dongia, chietkhau =
dbo Ckhau(soluong, dongia, @m1, @dg, @m2,
@dg2, @m3, @dg3, @dg4)
From Sach s, Chitiethoadon c
Trang 44Bài tập 2
Create function ckhau(@solg int, @gia float, @m1 int,
@dg1 float, @m2 int, @dg2 float, @m3 int, @dg3
set @ck = @dg3 *@gia else
Trang 45 Raiserror
Transaction
Trang 46 Các thông báo lỗi có thể:
được trả về bởi chính SQL Server khi có lỗi xảy ra
Hoặc được phát ra bằng lệnh RAISERROR
Cú pháp
RAISERROR ( { msg_id | msg_str } { ,
severity , state } [ , argument [ , n ] ] )
Trang 47 msg_id : mã lỗi Mỗi thông báo lỗi trong
sysmessages có 1 mã lỗi
msg_str : thông báo chỉ ra lỗi và có thể chỉ ra
cách khắc phục lỗi Chuỗi thông báo có thể chứa
các biến và đối số thay thế, giống như hàm printf
của ngôn ngữ C
severity : Mức độ nghiêm trọng của lỗi
state : Số trạng thái lỗi _chỉ nguồn mà từ đó lỗi được tạo ra
Trang 48 Mức độ nghiêm trọng của lỗi : Có 25 mức độ
Mức từ 17 đến 25 chỉ ra các lỗi về phần cứng và phần
mềm và thường chỉ có nhà quản trị hệ thống mới giải quyết
và theo dõi các lỗi này
Mức từ 11 đến 16 được tạo ra bởi người dùng và người dùng có thể tự sửa chữa được.
Mức 10 thường lỗi mang tính chất thông báo và thường do nhầm lẫn khi gõ lệnh
Khi tạo thông báo lỗi của người dùng, mã lỗi phải lớn hơn 50,000 và mức độ nghiêm trọng từ 0 đến
18 Chỉ có các nhà quản trị hệ thống mới có thể tạo
Trang 50Transaction – giao tác
Transaction là 1 chuỗi các thao tác được
thực thi như 1 đơn vị công việc riêng (single logical unit of work).
Hoặc tất cả các lệnh trong transaction được thực thi , hoặc không lệnh nào được thực thi
Những chỉnh sửa của 1 trans độc lập với trans khác thi hành đồng thời
Kết quả của trans được lưu giữ ổn định trong hệ thống
Trang 51Transaction – các lệnh
Bắt đầu một transaction
BEGIN TRAN [ SACTION ] transaction_name
Hoàn tất một Transaction
COMMIT [ TRAN [ SACTION ] transaction_name
Đặt điểm dừng trong Transaction
SAVE TRAN [ SACTION ] { savepoint_name |
@savepoint_variable }
Hủy một Transaction
ROLLBACK [ TRAN [ SACTION ]
[ transaction_name | @tran_name_variable | savepoint_name | @savepoint_variable ] ]
Trang 55Cơ cấu thực thi
Khi lệnh insert và update được thực hiện, dòng dữ liệu thêm mới hay chỉnh sửa được lưu vào bảng
Inserted trong bộ nhớ cash
Khi lệnh delete dữ liệu được thực hiện, dòng dữ liệu
bị xóa được lưu vào bảng deleted trong bộ nhớ
cash
Các bảng Inserted và deleted có cấu trúc giống hệt bảng gốc, và truy suất được bởi các lệnh T_SQL
trong trigger
Trang 56Các lệnh
Hai loại trigger
FOR trigger / AFTER trigger
Trang 58IF EXISTS (Select * From INSERTED I, Sach s where
i.masach=s.masach and i.soluong > s.soluongton) Begin
RAISERROR(‘Không cập nhật được vì số lượng > slTon kho’,16,1) ROLLBACK TRAN
Trang 59Ví dụ 3
Create Trigger SLban2
ON cthd
INSTEAD OF INSERT, UPDATE
AS
IF EXISTS (Select * From INSERTED I, Sach s where i.masach=s.masach and i.soluong <= s.soluongton)
if not exists (select * from deleted)
Begin Insert cthd select * from Inserted End
else
begin Declare @sl int, @mahd char(5), @masach char(5) Set @sl = (select soluong from inserted )
Set @mahd = (select mahd from inserted) Set @masach = (select masach from inserted) update cthd set soluong = @sl
where mahd = @mahd and masach = @masach end