Pdfbài 2 bo mạch chủ (main) bảo trì sự cố máy tính-mastercode.vn
Bài 5 : Lập trình với CSDL trong SQL
1. 11
TR NG Đ I H C KHOA H C T NHIÊN TP.HCM
TRUNG TÂM TIN H C
SQL Server
2. 22
TR NG Đ I H C KHOA H C T NHIÊN TP.HCM
TRUNG TÂM TIN H C
Lập trình v i CSDL
5
3. 33
TR NG Đ I H C KHOA H C T NHIÊN TP.HCM
TRUNG TÂM TIN H C
Biến cục bộ
4. 44
TR NG Đ I H C KHOA H C T NHIÊN TP.HCM
TRUNG TÂM TIN H C
Khai báo biến cục bộ
• Dùng để l u tr các giá tr t m th i trong quá trình
tính toán
Biến phải có kiểu dữ liệu
Biến muốn sử dụng trong một batch phải khai báo trước
DECLARE @Tên_biến Kiểu_dữ_liệu [, ...]
Ví dụ :
DECLARE @Tongsldat INT, @Hotenncc CHAR(50)
DECLARE @Ngayxh DATETIME
5. 55
TR NG Đ I H C KHOA H C T NHIÊN TP.HCM
TRUNG TÂM TIN H C
Gán giá tr cho biến
SET @Biến = Giá_trị
SET @a = 5
Select @Biến = Tên_Cột From Tên_Bảng
Select @ConLai = TonCuoiKy From TonKho Where
MaVTu = ‘VT010’ And NamThang = ‘200402’
Sử dụng lệnh SET hoặc SELECT
6. 66
TR NG Đ I H C KHOA H C T NHIÊN TP.HCM
TRUNG TÂM TIN H C
Xem giá tr hiện hành của biến
• Lệnh PRINT
Print @Biến
Print @A
• Khi có kết hợp với chuỗi, phải đổi kiểu dữ liệu sang kiểu
chuỗi bằng hàm CAST hay CONVERT
Print ‘Giá trị của @A ‘ + cast(@A as char(4))
7. 77
TR NG Đ I H C KHOA H C T NHIÊN TP.HCM
TRUNG TÂM TIN H C
Ph m vi ho t động của biến
• Một biến chỉ có ph m vi ho t động cục bộ
Trong một Batch
Trong một Stored Procedure hay Trigger
DECLARE @Ngaydhgn DATETIME
SELECT @Ngaydhgn=MAX(NGAYDH)
FROM DONDH
GO
PRINT 'Ngày đặt hàng gần nhất: ' +
CONVERT(CHAR(12),@Ngaydhgn)
GO
8. 88
TR NG Đ I H C KHOA H C T NHIÊN TP.HCM
TRUNG TÂM TIN H C
Biến hệ thống
9. 99
TR NG Đ I H C KHOA H C T NHIÊN TP.HCM
TRUNG TÂM TIN H C
Ý nghĩa sử dụng
• Cung cấp các thông tin hệ thống nh
Phiên bản SQL Server
Số dòng dữ liệu vừa được xử lý bởi câu lệnh
Mã lỗi
Số lượng kết nối
Tình trạng cursor
…
• Không cần khai báo
Biến do SQL Server định sẵn
Tên bắt đầu bởi @@
10. 1010
TR NG Đ I H C KHOA H C T NHIÊN TP.HCM
TRUNG TÂM TIN H C
Một vài biến hệ thống th ng dùng
• @@RowCount
Tổng số mẩu tin được tác động của câu lệnh truy vấn gần nhất.
• @@Error
Số mã lỗi của câu lệnh thực hiện gần nhất
Khi một câu lệnh thực hiện thành công thì giá trị là 0.
• @@Fetch_Status
Trạng thái của việc đọc dữ liệu trong bảng theo cơ chế từng mẩu
tin (cursor).
Khi đọc dữ liệu của mẩu tin thành công thì giá trị là 0.
11. 1111
TR NG Đ I H C KHOA H C T NHIÊN TP.HCM
TRUNG TÂM TIN H C
Các toán tử
12. 1212
TR NG Đ I H C KHOA H C T NHIÊN TP.HCM
TRUNG TÂM TIN H C
Toán tử số h c
Ký hiệu Ý nghĩa
+ Thực hiện phép cộng hai số
- Thực hiện phép trừ hai số.
* Thực hiện phép nhân hai số.
/ Thực hiện phép chia hai số.
% Thực hiện phép chia lấy phần dư.
13. 1313
TR NG Đ I H C KHOA H C T NHIÊN TP.HCM
TRUNG TÂM TIN H C
Toán tử nối chuỗi
• Sử dụng dấu + làm toán tử nối chuỗi
SELECT 'Hello' + ' ' + 'The World!'
SELECT 'Ngày đặt hàng D007 là: '
+ CAST(NGAYDH AS CHAR(11))
FROM DONDH
WHERE SODH='D007'
14. 1414
TR NG Đ I H C KHOA H C T NHIÊN TP.HCM
TRUNG TÂM TIN H C
Toán tử so sánh
Ký hiệu Ý nghĩa
= Thực hiện phép so sánh bằng.
> Thực hiện phép so sánh lớn hơn.
< Thực hiện phép so sánh nhỏ hơn.
>= Thực hiện phép so sánh lớn hơn hoặc bằng.
<= Thực hiện phép so sánh nhỏ hơn hoặc bằng.
<> Thực hiện phép so sánh khác.
!= Thực hiện phép so sánh khác.
!> Thực hiện phép so sánh không lớn hơn.
!< Thực hiện phép so sánh không nhỏ hơn.
15. 1515
TR NG Đ I H C KHOA H C T NHIÊN TP.HCM
TRUNG TÂM TIN H C
Toán tử luận lý
• Sử dụng các toán tử thông th ng AND,
OR, NOT vẫn dùng trong các câu SQL
SELECT * FROM VATTU
WHERE (DVTINH='Bộ' AND PHANTRAM>10)
OR (DVTINH='Cái' AND
PHANTRAM>20)
16. 1616
TR NG Đ I H C KHOA H C T NHIÊN TP.HCM
TRUNG TÂM TIN H C
Cấu trúc điều khiển
17. 1717
TR NG Đ I H C KHOA H C T NHIÊN TP.HCM
TRUNG TÂM TIN H C
Cấu trúc rẽ nhánh IF...ELSE
IF Biểu_thức_luận_lý
Câu_lệnh1 | Khối_lệnh1
[ ELSE
Câu_lệnh2 | Khối_lệnh2 ]
18. 1818
TR NG Đ I H C KHOA H C T NHIÊN TP.HCM
TRUNG TÂM TIN H C
Ví Dụ :
IF (SELECT COUNT(*) FROM CTPXUAT WHERE SLXUAT>4) > 0
BEGIN
PRINT 'Danh sách các hàng hóa bán với số lượng > 4'
SELECT CTPX.MAVTU, TENVTU, SLXUAT
FROM CTPXUAT CTPX INNER JOIN VATTU VT
ON VT.MAVTU=CTPX.MAVTU
WHERE SLXUAT>4
END
ELSE
PRINT 'Chưa bán hàng hóa nào với số lượng >4'
19. 1919
TR NG Đ I H C KHOA H C T NHIÊN TP.HCM
TRUNG TÂM TIN H C
Cú pháp If Exists
IF EXISTS (SELECT * FROM CTPXUAT WHERE SLXUAT>4)
BEGIN
PRINT 'Danh sách các hàng hóa bán với số lượng > 4'
SELECT CTPX.MAVTU, TENVTU, SLXUAT
FROM CTPXUAT CTPX INNER JOIN VATTU VT ON VT.MAVTU=CTPX.MAVTU
WHERE SLXUAT>4
END
ELSE
PRINT 'Chưa bán hàng hóa nào với số lượng >4'
IF EXISTS (Câu_lệnh_SELECT)
Câu_lệnh1 | Khối_lệnh1
[ ELSE
Câu_lệnh2 | Khối_lệnh2 ]
20. 2020
TR NG Đ I H C KHOA H C T NHIÊN TP.HCM
TRUNG TÂM TIN H C
Cấu trúc lặp WHILE
DECLARE @Songuyen INT
SET @Songuyen=100
WHILE (@Songuyen<110)
BEGIN
PRINT 'Số nguyên : ' + CONVERT(CHAR(3), @Songuyen)
SET @Songuyen = @Songuyen + 1
END
WHILE Biểu_thức_luận_lý
BEGIN
Các_lệnh_lặp
END
21. 2121
TR NG Đ I H C KHOA H C T NHIÊN TP.HCM
TRUNG TÂM TIN H C
Sử dụng biến kiểu d liệu
cursor
22. 2222
TR NG Đ I H C KHOA H C T NHIÊN TP.HCM
TRUNG TÂM TIN H C
Khái niệm về cursor
• Các lệnh của SQL Server làm việc trên một
nhóm nhiều mẩu tin
• Cursor là cấu trúc giúp làm việc v i từng mẩu
tin t i một th i điểm
Khai báo cursor như một câu lệnh SELECT
Có thể di chuyển giữa các mẩu tin trong cursor để làm
việc
Có thể dùng cursor để cập nhật dữ liệu (Update, Delete)
23. 2323
TR NG Đ I H C KHOA H C T NHIÊN TP.HCM
TRUNG TÂM TIN H C
Các b c sử dụng kiểu d liệu cursor
• Định nghĩa biến kiểu cursor bằng lệnh DECLARE
Có hai loại cursor: Local, Global
Cách di chuyển mẩu tin trong cursor: Forward only, scroll
Cách quản lý dữ liệu của cursor: static, dynamic, keyset
• Sử dụng lệnh OPEN để mở ra cursor đã định nghĩa trước đó
• Đọc và xử lý trên từng dòng dữ liệu bên trong cursor
Sử dụng biến @@Fetch_status
Các lệnh Fetch và cấu trúc while
• Đóng cursor lại bằng lệnh CLOSE và DEALLOCATE
Sau khi close, có thể mở lại
Deallocate: hủy cursor khỏi bộ nhớ
24. 2424
TR NG Đ I H C KHOA H C T NHIÊN TP.HCM
TRUNG TÂM TIN H C
Cú pháp Declare
DECLARE Tên_cursor CURSOR
[LOCAL | GLOBAL]
[FORWARD_ONLY | SCROLL]
[STATIC | DYNAMIC | KEYSET]
[READ_ONLY | SCROLL_LOCK]
FOR Câu_lệnh_SELECT
[FOR UPDATE [OF Danh_sách_cột_cập_nhật]]
DECLARE cur_Vattu CURSOR
DYNAMIC
FOR
SELECT * FROM VATTU
25. 2525
TR NG Đ I H C KHOA H C T NHIÊN TP.HCM
TRUNG TÂM TIN H C
Cú pháp Open
OPEN Tên_cursor
DECLARE cur_Vattu CURSOR
DYNAMIC
FOR
SELECT * FROM VATTU
OPEN cur_Vattu
26. 2626
TR NG Đ I H C KHOA H C T NHIÊN TP.HCM
TRUNG TÂM TIN H C
Cú pháp FETCH
FETCH [NEXT | PRIOR | FIRST | LAST
| ABSOLUTE n | RELATIVE n]
FROM Tên_cursor
[INTO Danh_sách_biến]
Absolute n: Đọc dòng thứ n trong cursor
Relative n: Đọc dòng thứ n kể từ vị trí hiện hành
27. 2727
TR NG Đ I H C KHOA H C T NHIÊN TP.HCM
TRUNG TÂM TIN H C
Ví dụ hoàn chỉnh
--1. Khai báo biến cursor
DECLARE cur_Vattu CURSOR KEYSET
FOR SELECT * FROM VATTU
WHERE MAVTU LIKE 'TV%'
ORDER BY MAVTU
--2. Mở cursor
OPEN cur_Vattu
--3. Đọc dữ liệu
FETCH NEXT FROM cur_Vattu
WHILE @@FETCH_STATUS = 0
BEGIN
-- Xử lý dòng mới vừa đọc được
-- Thực hiện đọc tiếp các dòng kế
FETCH NEXT FROM cur_Vattu
END
--4. Đóng cursor
CLOSE cur_Vattu
DEALLOCATE cur_Vattu
28. 2828
TR NG Đ I H C KHOA H C T NHIÊN TP.HCM
TRUNG TÂM TIN H C
Các hàm th ng dùng
29. 2929
TR NG Đ I H C KHOA H C T NHIÊN TP.HCM
TRUNG TÂM TIN H C
Các hàm chuyển đổi kiểu d liệu
Một hàm của SQL Server có thể sử dụng ở bất cứ đâu thay
cho một giá trị cụ thể
• Đổi một số thành chuỗi
STR (Số_thực, Số_ký_tự [, Số_lẻ])
• Đổi kiểu dữ liệu
CAST (Biểu_thức AS Kiểu_dữ_liệu)
• Đổi kiểu dữ liệu và định dạng
CONVERT (Kiểu_dữ_liệu, Biểu_thức [, Định_dạng])
30. 3030
TR NG Đ I H C KHOA H C T NHIÊN TP.HCM
TRUNG TÂM TIN H C
Một số đ nh d ng chuỗi ngày thông
dụng
yy yyyy Chuỗi kết quả
- 0 hoặc 100 mon dd yyyy hh:miAM (or PM)
1 101 mm/dd/yyyy
2 102 yy.mm.dd
3 103 dd/mm/yy
5 105 dd-mm-yy
6 106 dd mon yy
8 108 hh:mm:ss
9 109 mon dd yyyy hh:mi:ss:mmmAM (or PM)
10 110 mm-dd-yy
11 111 yy/mm/dd
12 112 yymmdd
…
Print convert(nvarchar(50), getdate(), 5) 23-05-09
Print convert(nvarchar(50), getdate(), 105) 23-05-2009
31. 3131
TR NG Đ I H C KHOA H C T NHIÊN TP.HCM
TRUNG TÂM TIN H C
Các hàm ngày gi
• Cộng ngày
DATEADD (Đơn_vị, Con_số, Ngày_chỉ_định)
• So sánh hai biến ngày
DATEDIFF (Đơn_vị, Ngày1, Ngày2)
• Lấy tên ngày, tháng, năm
DATENAME (Đơn_vị, Ngày)
• Thời điểm hiện hành
GETDATE()
• Lấy một thành phần ngày, giờ trong biến ngày
DATEPART (Đơn_vị, Ngày)
• Lấy ngày, tháng, năm của biến ngày
DAY (Ngày)
MONTH (Ngày)
YEAR (Ngày)
32. 3232
TR NG Đ I H C KHOA H C T NHIÊN TP.HCM
TRUNG TÂM TIN H C
Đơn_v (Thành phần của ngày) Ch viết tắt
year yy, yyyy
quarter qq, q
month mm, m
dayofyear dy, y
day dd, d
week wk, ww
weekday dw
hour hh
minute mi, n
second ss, s
millisecond ms
33. 3333
TR NG Đ I H C KHOA H C T NHIÊN TP.HCM
TRUNG TÂM TIN H C
Các hàm toán h c
• Lấy trị tuyệt đối
ABS (Biểu_thức_số)
• Hằng số Pi
PI()
• Luỹ thừa
POWER (Biểu_thức_số, Số_mũ)
• Lấy số ngẫu nhiên
RAND ([Số_nguồn])
• Làm tròn số
ROUND (Biểu_thức_số, Vtrí_làm_tròn)
• Dấu của kết quả biểu thức : SIGN (Biểu_thức_số)
• Lấy căn bậc 2 : SQRT (Biểu_thức_số)
34. 3434
TR NG Đ I H C KHOA H C T NHIÊN TP.HCM
TRUNG TÂM TIN H C
Các hàm xử lý chuỗi
• Hàm viết hoa, th ng
UPPER (Chuỗi), LOWER (Chuỗi)
• Hàm cắt chuỗi
LEFT (Chuỗi nguồn, Số_ktự), RIGHT (Chuỗi nguồn, Số_ktự)
SUBSTRING (Chuỗi nguồn,Vị_trí,Số_ktự)
• Hàm cắt khoảng trắng, t o chuỗi khoảng trắng
LTRIM (Chuỗi), RTRIM (Chuỗi), SPACE (N)
• Hàm t o chuỗi lặp
REPLICATE (Chuỗi_lặp, N)
• Chiều dài chuỗi
LEN (Chuỗi)
• Đảo chuỗi
REVERSE (Chuỗi)
• Tìm và thay thế chuỗi
REPLACE (Chuỗi nguồn, Chuỗi_tìm, Chuỗi_thay_thế)
• Đổi từ số thành ký t và ng ợc l i
CHAR (Số) , ASCII(Ký_tự)
35. 3535
TR NG Đ I H C KHOA H C T NHIÊN TP.HCM
TRUNG TÂM TIN H C
Xử lý lỗi
36. 3636
TR NG Đ I H C KHOA H C T NHIÊN TP.HCM
TRUNG TÂM TIN H C
Khối lệnh TRY…CATCH
• Ý nghĩa : Thực hiện các lệnh trong khối TRY, nếu gặp lỗi sẽ chuyển
qua xử lý bằng các lệnh trong khối CATCH
• Cú pháp : BEGIN TRY
{ các câu lệnh }
END TRY
BEGIN CATCH
{ các câu lệnh}
END CATCH
• Các điểm cần lưu ý :
• TRY và CATCH phải cùng lô xử lý
• Sau khối TRY phải là khối CATCH
• Có thể lồng nhiều cấp
37. 3737
TR NG Đ I H C KHOA H C T NHIÊN TP.HCM
TRUNG TÂM TIN H C
Khối lệnh TRY…CATCH
Ví dụ :
BEGIN TRY
SELECT * FROM BangKhongTonTai;
END TRY
BEGIN CATCH
SELECT
ERROR_NUMBER() as ErrorNumber,
ERROR_MESSAGE() as ErrorMessage;
END CATCH
38. 3838
TR NG Đ I H C KHOA H C T NHIÊN TP.HCM
TRUNG TÂM TIN H C
Một số hàm ERROR th ng dùng
ERROR_NUMBER() : Trả về mã số của lỗi
ERROR_MESSAGE() Trả về chuỗi lỗi
ERROR_SEVERITY() returns the error severity.
ERROR_STATE() returns the error state number.
ERROR_LINE() : Trả về dòng gây ra lỗi
ERROR_PROCEDURE() Trả về tên thủ tục/ trigger gây ra lỗi
39. 3939
TR NG Đ I H C KHOA H C T NHIÊN TP.HCM
TRUNG TÂM TIN H C
Thủ tục RAISERROR
• Ý nghĩa : Trả thông báo lỗi về cho ứng dụng
• Cú pháp :
• Raiserror(tbao_loi, muc_do, trang_thai [, cac_tham_so] )
Trong đó:
tbao_loi : - mã thông báo lỗi do người dùng định nghĩa trước bằng
sp_addmessage và được lưu trong sys.messages. Giá trị phải lớn hơn
50000.
- chuỗi thông báo lỗi bất kỳ.
muc_do : Số có giá trị từ 025 thể hiện mức độ nghiêm trọng của lỗi.
trang_thai : Số từ 1-127 để xác định vị trí lỗi khi sử dụng cùng một tbao_loi
tại nhiều điểm khác nhau
cac_tham_so : Hỗ trợ cho các tbao_loi cần tham số
40. 4040
TR NG Đ I H C KHOA H C T NHIÊN TP.HCM
TRUNG TÂM TIN H C
Ví dụ sử dụng RAISERROR
…
IF @nPhanTram NOT BETWEEN 0 AND 100
BEGIN
SET @sErrMsg = N‘Tỉ lệ phầm trăm phải nằm trong đoạn [0,100]’
RAISERROR(@sErrMsg, 16, 1)
RETURN
END
…
Msg 50000, Level 16, State 1, Line 6
Tỉ lệ phầm trăm phải nằm trong đoạn [0,100]