Batch và script4 Lỗi biên dịch compile error ngăn không cho biên dịch bảng thực thi, vì vậy không có lệnh nào trong batch được thực thi.. Nếu batch được biên dịch, và lệnh thứ hai b
Trang 1Lập Trình SQL
Trang 3Batch và script
3
Batch là một tập hợp các lệnh tạo thành một nhóm và được gửi đi dưới dạng 1 nhóm lệnh thực thi
SQL Server biên dịch các lệnh của 1
batch thành 1 đơn vị thực thi đơn gọi là bảng thực thi (Execution plan) Các lệnh trong bảng thực thi được thực thi cùng lúc.
Trang 4Batch và script
4
Lỗi biên dịch ( compile error) ngăn không cho biên dịch bảng thực thi, vì vậy không có lệnh nào trong batch được thực thi.
Lỗi thực thi ( run-time error) g ây ra 1 trong 2 ảnh hưởng sau:
Hầu hết các lỗi thực thi đều dừng lệnh đang chạy
và các lệnh tiếp sau nó trong batch.
Một vài lỗi thực thi như vi phạm ràng buộc, chỉ làm dừng lệnh hiện hành Tất cả các lệnh còn lại trong batch vẫn được thực thi.
Trang 5Batch và script
5
Giả sử có 10 lệnh trong 1 batch
Nếu lệnh thứ 5 có lỗi cú pháp, không 1 lệnh nào trong batch được thực thi
Nếu batch được biên dịch, và lệnh thứ hai bị lỗi trong lúc thực thi, kết quả của lệnh đầu tiên không bị ảnh hưởng vì đã thực thi rồi
Trang 6Một số quy định khi sử dụng batch
6
1 Các lệnh CREATE DEFAULT, CREATE PROCEDURE,
CREATE RULE, CREATE TRIGGER, và CREATE VIEW
không thể được dùng chung cùng với các lệnh khác trong
cùng 1 batch Lệnh CREATE nên bắt đầu 1batch, cac lệnh khác tiếp theo trong batch sẽ đuợc thông dịch như phần bổ sung vào định nghĩa của lệnh CREATE
2 Một bảng không thể vừa được thay đổi (alter) rồi ngay sau đó
các cột mới đuợc sử dụng ngay trong cùng 1 batch.
3 Nếu lệnh EXECUTE là lệnh đầu tiên trong 1 batch, từ khóa
EXECUTE không bắt buộc Từ khóa này bắt buộc phải dùng khi nó không phải là lệnh đầu tiên trong 1 batch
Trang 7Đinh nghi a Batch ̣ ̃
7
Có nhiều cách để tạo một batch:
Tất cả các lệnh SQL được gửi đến từ 1 ứng dụng được xem như 1 batch
Tất cả các lệnh trong 1 thủ tục hay trigger được xem như 1 batch
Một chuỗi được thực thi bởi lệnh EXECUTE là 1 batch
Một chuỗi được thực thi bởi thủ tục hệ thống
sp_executesql là 1 batch
Mỗi batch sẽ được biên dịch thành 1 kế hoạch thực thi đơn (single execution plan)
Trang 8 Các biến cục bộ ( local variable ) chỉ có tác
dụng trong phạm vi của batch tạo ra nó không thể tham chiếu các biến này sau khi kết thúc 1 batch
Trang 9Vi du vê batch ́ ̣ ̀
9
USE pubs
GO
DECLARE @MyMsg VARCHAR(50)
SELECT @MyMsg = 'Hello, World.'
GO Biến @MyMsg không còn hợp lệ sau lệnh
Trang 11Các h n ch c a Script ạ ế ủ
11
Các lệnh CREATE DEFAULT, CREATE RULE, CREATE VIEW, CREATE PROCEDURE, and CREATE TRIGGER phải được đặt trong 1 batch riêng chỉ chứa riêng các lệnh đó, không thể kết hợp với các lệnh khác được
Trang 12 Lệnh gắn kết (bind) các rule và default vào
các cột trong bảng không được để cùng batch với các lệnh sửa đổi dữ liệu trên các cột đó
Lệnh tạo và sử dụng các ràng buộc check
không thể đặt trong cùng 1 batch
Lệnh thay đổi các cột trong bảng (alter Table) không thể đặt cùng batch với các lệnh tham chiếu đến các cột vừa sửa
Trang 13Bi n - Variable ế
13
Trong Transact SQL, có 2 loại biến:
Biến cục bộ (Local variable hay user-defined variables) : là các biến được khai báo bên trong 1 batch và sẽ bị xoá khi batch kết thúc
Bi ến toàn cục ( Global variables) l à các biến được khai báo và gán giá trị bởi chính
server Biến toàn cục luôn bắt đầu bằng
@@.
Trang 14Global variables
14
Trang 15 Cách khai báo biến:
DECLARE @variable_name data_type
Để gán giá trị vào biến: dùng lệnh SET hoặc SELECT
Trang 16Bi n ng ế ườ i dùng
User defined Variables
16
thông báo của người dùng hoặc nội dung của biến ra màn hình
Ví dụ
USE Northwind
GO
DECLARE @MyObject NVARCHAR(128)
SET @MyObject = 'Products'
PRINT 'Object Name: ' + @MyObject
PRINT ' Object ID: ' + STR(123456)
Trang 17L p trình trong SQL Server ậ
17
Các lệnh điều khiển (Control-of-Flow) dùng để điều khiển thứ tự thực hiện các lệnh trong batch, stored procedure, trigger và transaction
Lệnh IF…ELSE
Lệnh CASE
Lệnh WHILE
Trang 18L nh IF…ELSE ệ
18
điều kiện các lệnh của SQL.
IF boolean_expression {sql_statement | statement_block} [ELSE boolean_expression
{sql_statement | statement_block}]
Trang 19Kh i l nh BEGIN…END ố ệ
19
nhóm lệnh đó bên trong khối lệnh BEGIN và END
BEGIN
{sql_statement | statement_ block}
END
Trang 20Ví d 1 ụ
20
Điểm thi (test score) tối thiểu để được mời phỏng vấn cho các ứng viên nội bộ (internal candidate) là 80 Hãy viết 1 batch hiển thị câu thông báo “Được mời phỏng vấn” ( “Called for interview” ) cùng với điểm thi nếu điểm thi cao hơn 80, ngược lại hiển thị thông báo “Bị loại – Không được mời phỏng vấn”(“Rejected
- Not called for interview”) cho nhân viên có
mã là 000008.
Trang 21Ví d 1 ụ
21
DECLARE @iTest int
SELECT @iTest = siTestScore
END
Trang 22Ví d 2 ụ
22
Phí phần phăm (siPercentageCharge) đối với các nhà tuyển dụng theo hợp đồng phải tăng thêm 5% nếu phí trung bình ít hơn 20% và phải tăng thêm 3% trong
trường hợp ngược lại.
IF (SELECT AVG(siPercentageCharge)
FROM ContractRecruiter) < 20 BEGIN
UPDATE ContractRecruiter SET siPercentageCharge = siPercentagecharge + 5 END
ELSE
BEGIN
UPDATE ContractRecruiter SET siPercentageCharge = siPercentagecharge + 3 END
Trang 23 Lệnh CASE có 2 dạng như sau:
Dạng đơn giản: lệnh sẽ so sánh 1 biểu thức
input_expression với 1 bộ các biểu thức đơn giản
để chọn ra nhánh cần thực hiện.
Dạng dò tìm: lệnh sẽ đánh giá 1 bộ các biểu thức điều kiện để chọn nhánh cần thực hiện
Trang 24 Searched CASE function:
Trang 25Ví d l nh case d ng đ n gi n ụ ệ ạ ơ ả
25
USE pubs
GO SELECT Category = CASE type WHEN 'popular_comp' THEN 'Popular Computing' WHEN 'mod_cook' THEN 'Modern Cooking'
WHEN 'business' THEN 'Business' WHEN 'psychology' THEN 'Psychology' WHEN 'trad_cook' THEN 'Traditional Cooking' ELSE 'Not yet categorized'
END, CAST(title AS varchar(25)) AS 'Shortened Title', price AS Price
FROM titles WHERE price IS NOT NULL ORDER BY type, price COMPUTE AVG(price) BY type
GO
Trang 26Ví d l nh case d ng dò tìm ụ ệ ạ
26
USE pubs
GO
SELECT 'Price Category' = CASE
WHEN price IS NULL THEN 'Not yet priced'
WHEN price < 10 THEN 'Very Reasonable Title' WHEN price >= 10 and price < 20 THEN 'Coffee Table Title'
ELSE 'Expensive book!'
END,
CAST(title AS varchar(20)) AS 'Shortened Title' FROM titles ORDER BY price
GO
Trang 27L nh WHILE ệ
27
Lệnh WHILE có thể được dùng trong batch,
stored procedure, trigger, hay cursor để cho phép
1 khối lệnh T-SQL được thực hiện lặp lại chừng nào mà điều kiện vẫn còn TRUE
Cú pháp
WHILE boolean_expression {sql_statement | statement_block}
[BREAK]
{sql_statement | statement_block}
[CONTINUE]
Trang 29BREAK END
IF @count=6 BEGIN
CONTINUE END
PRINT @count END
???
Trang 30IF (SELECT MAX(price) FROM titles) > $50 BREAK
ELSE
CONTINUE END
PRINT 'Too much for the market to bear'
Trang 31 Ví dụ:
Aa: print ‘ Successful’
…….
Goto Aa
Trang 33L nh Execution ệ
33
EXEC[UTE] được dùng để thực thi
Thực thi 1 chuỗi lệnh
Thực thi 1 thủ tục
Trang 34Lênh Execute th c thi 1 ̣ ự
chuô ĩ
Cú pháp:
EXEC [ UTE ]
( { @string_variable | [ N ] 'tsql_string' } [ + n ] )
Sử dụng toán tử + để tạo các chuỗi dài Mỗi
chuỗi có thể chứa cả loại Unicode và Unicode
Trang 35L nh Execution th c thi 1 thu tuc ệ ự ̉ ̣
Trang 38Stored procedures
38
Một thủ tục tạm thời cục bộ ( local temporary
stored procedure) có tên bắt đầu với ký hiệu # và chỉ có tác dụng trong phiên làm việc của người dùng
Một thủ tục tạm thời toàn cục (global temporary stored procedure) có tên bắt đầu với biểu tượng
## và thủ tục có tác dụng cho tất cả phiên làm việc của ngươì dùng
Trang 39Stored procedures
39
Thủ tục chứa các lệnh T-SQL để thực thi 1 nhiệm
vụ (task) Thủ tục được thiết kế, mã hóa, kiểm tra
và biên dịch thành mã thực thi (single execution plan) đăt ngay server Các ứng dụng (application) khi cần thực thi nhiệm vụ, chỉ cần gọi thủ tục
Server sẽ chạy execution plan và trả kết quả về lại client
Thực thi nhanh hơn
Giảm lưu lượng mạng (network traffic)
Trang 40 Cho phép thực thi nhanh hơn: thủ tục được kiểm tra lỗi và tối
ưu khi chúng được tạo và được biên dịch thành 1 execution plan ở lần chạy đầu tiên Các lần sau đó khi client có yêu cầu chạy thủ tục thì server sẽ chạy từ execution plan đã biên dịch sẵn.
Có thể giảm lưu lượng mạng: để thực thi 1 tác vụ, thay vì phải gửi có lúc lên đến hàng trăm lệnh về server, chỉ cần dùng 1 lệnh gọi thủ tục là đủ
Có thể đuợc dùng như cơ chế bảo mật: người dùng được cấp quyền để chạy thủ tục thậm chí ngay cả khi họ không có
quyền thực thi từng lệnh đơn lẻ trong thủ tục.
Trang 41Stored procedure
41
Khi 1 thủ tục được tạo ra, tên thủ tục được viết vào bảng hệ thống sysobjects, nội dung của thủ tục thì được lưu trong bảng hệ thống
syscomments
Thủ tục khi chạy lần đầu hay được biên dịch lại
sẽ theo 3 bước sau:
Resolution
Optimization
Compilation
Trang 42Th c thi l n đ u ự ầ ầ
42
Resolution — Công cụ xử lý truy vấn (query processor) đọc và kiểm tra lỗi chính tả của thủ tục
Optimization — Công cụ tối ưu hoá truy vấn phát triển một execution plan cho các lệnh trong thủ tục
Compilation — trong quá trình biên dịch, thủ tục được phân tích và execution plan được tạo ra Execution plan được nạp vào bộ nhớ ( procedure cache)
SQL Server 2000 có 1 vùng bộ nhớ được dùng
để lưu trữ cả execution plan và vùng đệm dữ liệu
Trang 43Object có thể là stored procedure, trigger, table
Dùng lệnh tạo thủ tục (CREATE PROCEDURE) với tùy chọn WITH RECOMPILE để quy định SQL Server không cần lưu vào bộ nhớ execution plan của thủ tục này, mà thủ tục cần được biên dịch lại mỗi lần thủ tục được gọi
Dùng lệnh EXECUTE với tuỳ chọn WITH RECOMPILE để gọi
1 thủ tục
Trang 44M t s hu ng d n khi t o và s d ng ộ ố ớ ẫ ạ ử ụ
th t c ủ ụ
44
Mỗi thủ tục chỉ nên hoàn thành 1 nhiệm vụ
Lệnh tạo thủ tục (CREATE PROCEDURE) không thể chứa các lệnh CREATE VIEW, CREATE
DEFAULT, CREATE PROCEDURE, CREATE
RULE, hay CREATE TRIGGER
Các lệnh CREATE TABLE và CREATE INDEX có thể được tạo và tham chiếu ngay trong cùng 1 thủ tục
Trang 45 Các bảng tạm (Temporary table) có thể được tạo
ra bên trong thủ tục và được tự động xoá khi thủ tục kết thúc
Có thể tham chiếu đến các đối tượng từ các CSDL khác và server từ xa
Cho phép các thủ tục đệ quy (recursive) – thủ tục
có thể gọi chính nó
Trang 49Tham s - Parameters ố
49
Tham số là nơi mà thủ tục dùng để nhận giá trị của người dùng mỗi khi thủ tục được thực thi
Hai loại tham số:
Tham sốvào (Input parameter)
Tham số ra (Output parameter)
Có thể có tới 2100 tham số được dùng trong thủ tục
Tham số vào (Input parameter) để đưa giá trị vào thủ tục.
Tham số ra (Output parameter) dùng để đưa giá trị ra khỏi thủ tục
Mỗi thủ tục trả về 1 mã số nguyên (integer return code) cho người gọi Mặc định mã trả về là 0
Trang 50Th t c vào - Input parameters ủ ụ
50
Cú pháp
@parameter_name data_type [=default]
Có thể dùng tham số mặc định để đưa giá trị vào thủ tục trong trường hợp không có giá trị nào được đưa vào khi gọi thủ tục.
Giá trị mặc định phải là hằng hay NULL
Ví dụ:
CREATE PROC prcMultiplyNumber(
@Number1 int, @Number2 int=5) AS
PRINT @Number1*@Number2
Trang 53@Description char(30) OUTPUT,
@budget int OUTPUT,
@CurrentStrength int OUTPUT
AS
BEGIN
IF EXISTS(SELECT * FROM Position WHERE cPositionCode =@PCode)
Trang 54FROM Position WHERE cPositionCode=@Pcode RETURN 0
END
ELSE
RETURN 1 END
Trang 55DECLARE @Description char(30)
DECLARE @budget int
DECLARE @CurrentStrength int
DECLARE @ReturnValue int
EXEC @ReturnValue = prcGetPositionDetail @Pcode,
PRINT ‘Chức danh: ‘ + @Description
PRINT ‘Số nhân viên theo ngân sách: ' +
CONVERT( char(30),@budget)
PRINT ‘Số nhân viên hiện tại : ' + CONVERT (char(30),
@CurrentStrength)
Trang 56Ví dụ
56
SELECT cRequisitionCode,vRegion,
iNoOfVacancy FROM Requisition
Trang 57D liêu tra vê (return data) ư ̃ ̣ ̉ ̀
Dữ liệu trả về từ 1 thủ tục theo 1 trong 4 cách
sau:
1. Tham số ra (Output parameters)
2. Mã trả về (Return codes) luôn luôn là 1 số
nguyên
3. Một bộ kết quả (result set) cho mỗi một
lệnh SELECT bên trong thủ tục
4. Một cursor toàn cục (global cursor) mà
cursor này có thể được tham chiếu đến từ bên ngoài thủ tục
57
Trang 58Qu n lý l i - Error handling ả ỗ
58
Các lỗi trong thủ tục thường được quản lý bằng cách hoặc dùng giá trị trả về (return values) hoặc dùng lệnh RAISERROR
Giá trị trả về là 1 số nguyên khi lệnh RETURN
được thực thi
Trang 59Ví d cách dùng return ụ
59
CREATE PROC Check_Customer
@custid char(6) = NULL
Trang 60Ví d cách dùng return ụ
60
DECLARE @getres int
EXEC @getres = Check_Customer
Trang 61Vi du 2: thu tuc v i nhiê u ca ch tra vê ́ ̣ ̉ ̣ ơ ́ ̀ ́ ̉ ̀ gia tri ́ ̣
Ord.EmployeeID ORDER BY Ord.EmployeeID
SELECT @MaxQuantity = MAX(Quantity) FROM [Order
Details]
RETURN (SELECT SUM(Quantity) FROM [Order Details])
61
Trang 62Vi du 2: thu tuc v i nhiê u ca ch tra vê ́ ̣ ̉ ̣ ơ ́ ̀ ́ ̉ ̀ gia tri ́ ̣
Kiểm tra thủ tục bằng script sau:
DECLARE @OrderSum INT
DECLARE @LargestOrder INT
EXEC @OrderSum = OrderSummary @MaxQuantity =
Trang 63Vi du 2: thu tuc v i nhiê u ca ch tra vê ́ ̣ ̉ ̣ ơ ́ ̀ ́ ̉ ̀ gia tri ́ ̣
Kết quả khi chạy script kiểm tra:
The size of the largest single order was: 130
The sum of the quantities ordered was: 51317
63
Trang 66L ệ nh xoá th t c ủ ụ
66
Được dùng để xoá thủ tục khỏi database
Cú pháp
DROP PROCEDURE proc_name
Không thể khôi phục 1 thủ tục ngay khi nó bị xoá
Trang 67L nh RAISERROR ệ
67
Các thông báo lỗi có thể:
Hoặc được trả về bởi chính SQL Server khi có lỗi xảy ra
Hoặc được tạo ra bằng lệnh RAISERROR
RAISERROR có thể khôi phục bất kỳ thông báo hệ thông
nào đang được lưu trữ trong bảng hệ thống sysmessages,
hay có thể là thông báo của người dùng
Mỗi thông báo chứa:
Số thông báo hệ thống: mỗi thông báo đều có 1 số xác định duy
nhất (msg_id).
Mức độ nghiêm trọng (severity level): cho biết mức độ lỗi xảy ra.
Số trạng thái lỗi: dùng đẻ chỉ nguồn mà từ đó lỗi được tạo ra
Và cuối cùng là thông báo chỉ ra lỗi và đôi khi chỉ ra cách khắc phục lỗi
Trang 68mề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 tao 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, số thông
báo 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 ra các thông báo lỗi mức 19 đến 25
Trang 69 RAISERROR được ghi nhận lại trong các nhật ký lỗi
(error log) của SQL Server 2000 và Microsoft Windows
Chuỗi thông báo (message string) 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
Trang 71Các tham sô cua msg_str ́ ̉
71
msg_str: là 1 thông báo đặc biệt với định dạng tương
tự như lệnh printf của C Thông báo lỗi có thể chứa tối đa 400 ký tự, nếu dài hơn thi chỉ có 397 ký tự đầu tiên được hiển thị , các ký tự còn lại được ký hiệu
thành dấu chấm lửng
% [[flag] [width] [precision] [{h | l}]] type
Trang 72Các tham số của msg_str
{h | l} type: được dùng với các loại ký tự d, i, o, x, X,
or u, và tạo các giá trị số nguyên ngắn (short int h) hay
số nguyên dài (long int l).
type Biểu diễn
d hay i Số nguyên có dấu
o Số bát phân không dấu
u Số nguyên không dấu
x hay X Số thập lục phân (hexadecimal)
không dấu
72