Chương 14 Thủ tục lưu (Hướng dẫn thực hành) Mục đích của chương 14 Kết thúc chương 14 bạn có thể: Tạo các thủ tục lưu trong Enterprise Manager bằng wizard, hoặc không cần wizard Sử dụng công cụ Query Analyzer để tạo các thủ tục lưu. Thực thi các thủ tục lưu trong Query Analyzer Biên dịch lại các thủ tục lưu trong Query Analyzer Sửa đổi các thủ tục lưu trong Query Analyzer và Enterprise Manager Sử dụng các tham số vào-ra cho các thủ tục Sử dụng các thủ tục lưu hệ thống. Xử lý các lỗi tính huống trong các thủ tục lưu Các bước được đưa ra trong chương này là chi tiết, dễ hiểu. Nó được tạo ra với mục đích giúp người đọc có thể học và hiểu công cụ một cách đầy đủ. Hãy làm theo các bước sau một cách cẩn thận. Phần I – Hướng dẫn Thời gian : 1 giờ 30 phút 14.1Thủ tục lưu Mọi người sử dụng cơ sở dữ liệu đều quan tâm đến tốc độ và hiệu quả của cơ sở dữ liệu đó. Thủ tục lưu giúp nâng cao tốc độ xử lý và hiệu quả của cơ sở dữ liệu. Thủ tục lưu là tập hợp các câu lệnh T-SQL đã được biên dịch trước, được lưu trữ dưới một tên nhất định, và được xử lý như một đơn vị Thủ tục lưu có thể được tạo trong Enterprise Manager, bằng Wizard hoặc không. 14.1.1 Tạo Thủ tục lưu không cần Wizard. Chúng ta hãy tạo một thủ tục lưu có tên là DisplayProducts trong cơ sở dữ liệu Northwind,mà không sử dụng wizard. Thủ tục sẽ hiển thị các sản phẩm được cung cấp bởi công ty Pavlova, Ltd. Các bước thực hiện như sau: 1. Nhấn đúp chuột vào cơ sở dữ liệu Northwind. Một danh sách các đối tượng bên trong cơ sở dữ liệu Northwind được hiển thị. 2. Nhấn chuột phải vào đối tượng Stored Procedures, và chọn New Stored Procedure… từ pop-up menu. Hộp thoại Stored Procedure Properties – New Stored Procedure được hiển thị. Thủ tục lưu 195 3. Nhập đoạn lệnh sau vào phần Text: CREATE PROCEDURE DisplayProducts AS SELECT productid, productname, unitprice FROM products p, suppliers s WHERE p.supplierid = s.supplierid AND companyname = 'Pavlova, Ltd.' Hình 14.1 Hiển thị hộp thoại với câu lệnh CREATE PROCEDURE Hình 14.1: Tạo thủ tục lưu không cần Wizard 4. Nhấn vào nút bấm Check Syntax để kiểm tra sự chính xác về cú pháp của đoạn mã. Một thông báo được hiển thị, như trong hình 14.2. Hình 14.2: Thông báo Syntax Check 196 Thiết kế cơ sở dữ liệu và thực hành với SQL Server 5. Nhấn vào nút bấm OK trên thông báo. 6. Nhấn vào nút bấm OK trong hộp thoại Stored Procedure Properties. Thủ tục DisplayProducts đã được tạo ra, và xuất hiện trong ô vuông bên phải, đó là danh sách các thủ tục lưu. 14.1.2 Tạo thủ tục lưu với Wizard SQL Server wizard có thể được sử dụng để tạo một thủ tục lưu. Wizard giúp tạo các thủ tục, các thủ tục này có thể được sử dụng để chèn, cập nhật và xóa dữ liệu từ một bảng. Chúng ta có thể đồng thời tạo các thủ tục lưu cho mỗi thao tác dữ liệu hoạt động trên một số bảng. Hãy sử dụng wizard tạo hai thủ tục lưu trong cơ sở dữ liệu Northwind: một để xóa dữ liệu từ bảng Categories, và thủ tục lưu còn lại để nhập thêm dữ liệu vào bảng Customers. Các bước thực hiện như sau: 1. Nhấn chuột vào biểu tượng Run a Wizard trên thanh công cụ. Hoặc nhấn chuột vào Tools trên menu và chọn tùy chọn Wizards từ drop-down menu. 2. Mở rộng tùy chọn Database. Một danh sách các wizard được hiển thị. 3. Chọn tùy chọn Create Stored Procedure Wizard . 4. Nhấn chuột vào nút bấm OK để bắt đầu wizard. Hộp thoại Create Stored Procedure Wizard được hiển thị. 5. Nhấn chuột vào nút bấm Next. 6. Bảo đảm rằng cơ sở dữ liệu Northwind đã được lựa chọn như Database name, và nhấn vào nút bấm Next. 7. Đánh dấu vào hộp chọn Insert cho bảng Customers, và họp chọn Delete cho bảng Categories, như trong hình 14.3. Thủ tục lưu 197 Hình 14.3: Chọn các thủ tục lưu. 8. Nhấn chuột vào nút bấm Next . 9. Chọn Finish để tạo các thủ tục. Một thông báo quá trình tạo các thủ tục đã thành công được hiển thị,như hình 14.4. Hình 14.4: Thông báo về quá trình tạo thủ tục lưu bằng Wizard. 10.Nhấn chuột vào nút OK. Hai thủ tục lưu mới tạo xuất hiện trong bên phải ô vuông mà liệt kê các thủ tục lưu. 14.1.3 Thực thi các thủ tục lưu Để thực thi một thủ tục lưu, Chúng ta phải sử dụng câu lệnh EXECUTE trong Query Analyzer. Chúng ta hãy thực thi thủ tục DisplayProducts đã được tạo từ đầu. Các bước thực hiện như sau: 198 Thiết kế cơ sở dữ liệu và thực hành với SQL Server 1. Trong Enterprise Manager, chọn Tools | SQL Query Analyzer. 2. Trong cửa sổ truy vấn , nhập vào câu lệnh sau: EXECUTE DisplayProducts 3. Nhấn vào nút chọn Execute Query trên thanh công cụ, hoặc nhấn phím F5 Thủ tục đã được thực thi , kết quả như trên hình 14.5. Hình 14.5: Thi hành một thủ tục lưu. 14.1.4 Biên dịch lại thủ tục lưu . Một thủ tục lưu bắt buộc phải được biên dịch lại để chắc chắn rằng các truy vấn trong thủ tục đã được tối ưu hóa tương ứng với việc thay đổi các chỉ mục. Các thủ tục lưu có thể được biên dịch lại theo ba cách sau: Sử dụng thủ tục lưu hệ thống sp_recompile Thêm tùy chọn WITH RECOMPILE cùng với câu lệnh CREATE PROCEDURE Thêm tùy chọn WITH RECOMPILE cùng với câu lệnh EXECUTE Chúng ta hãy sử dụng câu lệnh EXECUTE cùng với tùy chọn WITH RECOMPILE để chạy thủ tục DisplayProducts. Để xem tác động của tùy chọn, đầu tiên chúng ta sẽ thi hành thủ tục mà không có tùy chọn.Chúng ta sẽ sử dụng lệnh SET STATISTICS TIME ON để hiển thị số phần nghìn giây cần thiết để phân tích cú pháp, biên dịch và chạy mỗi một câu lệnh.Các bước thực hiện như sau: 1. Trong cửa sổ truy vấn Query Analyzer, đánh vào đoạn lệnh sau: SET STATISTICS TIME ON EXECUTE DisplayProducts 2. Nhấn vào nút bấm Execute Query trên thanh công cụ,hoặc nhấn phím F5. 3. Chọn Messages tab ở duới của sổ Results. Thủ tục lưu 199 Chi tiết của việc thực thi như phân tích cú pháp, biên dịch và thời gian thực hiện mỗi câu lệnh được hiện thị trong hình 14.6. Hình 14.6: Thời gian kiểm tra thực hiện thủ tục lưu. Thời gian phân tích cú pháp và biên dịch là 0 phần nghìn giây. Bây giờ chúng ta thực thi thủ tục lưu đó một lần nữa nhưng với tùy chọn WITH RECOMPILE. 4. Trong cửa sổ truy vấn Query Analyzer, nhập vào câu lệnh sau: EXECUTE DisplayProducts WITH RECOMPILE 5. Nhấn vào nút bấm Execute Query trên thanh công cụ,hoặc nhấn phím F5. 6. Chọn tùy chọn Messages tab ở dưới cửa sổ Results. Chi tiết quá trình thực thi được hiển thị trong hình 14.7. 200 Thiết kế cơ sở dữ liệu và thực hành với SQL Server Hình 14.7: Thời gian kiểm tra thực thi thủ tục lưu Thời gian phân tích cú pháp và biên dịch là 7 phần nghìn giây, thời gian này chỉ ra rằng tùy chọn WITH RECOMPILE có tác động mạnh lên quá trình biên dịch một thủ tục lưu. 7. Đóng cửa sổ Query Analyzer. 14.1.5 Sửa đổi các thủ tục lưu. Chúng ta có thể sử dụng công cụ Enterprise Manager để sửa đổi các thủ tục lưu.Chúng ta sẽ sửa đổi thủ tục DisplayProducts để nó chấp nhận tên công ty như một tham số của thủ tục.Thủ tục sẽ hiển thị các sản phẩm được cung cấp bởi một công ty đã được chỉ định.Các bước thực hiện trong Enterprise Manager lần lượt như sau: 1. Chọn đối tượng Stored Procedures ở trong cơ sở dữ liệu Northwind. 2. Trong ô bên phải, nhấn chuột phải vào thủ tục DisplayProducts. 3. Chọn Properties từ pop-up menu. 4. Sửa đổi đoạn mã trong Text như sau: CREATE PROCEDURE DisplayProducts @v_coname VARCHAR(40) AS SELECT productid, productname, unitprice FROM products p, suppliers s WHERE p.supplierid = s.supplierid Thủ tục lưu 201 AND companyname = @v_coname GO 5. Nhấn vào nút bấm Check Syntax để kiểm tra sự chính xác về cú pháp của đoạn mã . 6. Nhấn vào nút bấm OK trên hộp thoại thông báo việc kiểm tra cú pháp đã thành công. 7. Nhấn vào nút bấm Apply để ghi lại những sự thay đổi . 8. Nhấn vào nút bấm OK để đóng hộp thoại Stored Procedure Properties. 14.1.6 Xóa các thủ tục lưu. Chúng ta có thể sử dụng công cụ Enterprise Manager để xóa các thủ tục lưu.Bây giờ chúng ta sẽ xóa thủ tục DisplayProducts. Các bước thực hiện trong Enterprise Manager như sau: 1. Chọn đối tượng Stored Procedures ở trong cơ sở dữ liệu Northwind. 2. Trong ô bên phải, nhấn chuột phải vào thủ tục DisplayProducts. 3. Chọn Delete từ pop-up menu. 4. Trong hộp thoại Drop Objects, nhấn vào nút bấm Drop All . Thủ tục lưu DisplayProducts đã được xóa và nó không còn xuất hiện trong ô bên phải liệt kê các thủ tục lưu. Phần II – Bài tập Thời gian : 30 phút Thực hiện các thao tác sau trong Query Analyzer sử dụng cơ sở dữ liệu pubs : 1. Tạo một thủ tục lưu tên là Get_Sales_Avg có trường author ID là một tham số. Thủ tục sẽ hiển thị the average year-to-date sales made on all titles written by the author. Sử dụng câu lệnh CREATE PROCEDURE, và một biến cục bộ cho tham số. 2. Thực thi thủ tục Get_Sales_Avg để chắc chắn rằng nó đã được biên dịch lại . Chuyền tham số author ID là 267-41-2394 cho thủ tục. Sử dụng câu lệnh EXECUTE với tùy chọn WITH RECOMPILE. 3. Hiển thị tên của tất cả các thủ tục lưu được khai báo trong cơ sở dữ liệu pubs. Sử dụng thủ tục lưu hệ thống sp_stored_procedures. 4. Hiển thị mã cho thủ tục lưu Get_Sales_Avg. Sử dụng thủ tục lưu hệ thống sp_helptext. Phần III – Bài tập về nhà. Thực hiện các thao tác sau trong Query Analyzer sử dụng cơ sở dữ liệu pubs: 202 Thiết kế cơ sở dữ liệu và thực hành với SQL Server 1. Sửa đổi thủ tục lưu Get_Sales_Avg đã được tạo trong phần II. Thủ tục sẽ ghi lại lỗi nếu trường author ID được nhập vào không đúng. Nếu trường author ID đúng, the average year- to-date sales for all titles written by the author sẽ được trả về. 2. Thực hiện việc sửa đổi thủ tục Get_Sales_Avg cho author ID 267-41-2394. Nếu giá trị được trả về bởi thủ tục là lớn hơn 5000, sẽ hiện thị một thông báo là ‘High year-to-date sales’. Các trường hợp khác sẽ hiển thị thông báo ‘Low year-to-date sales’. Nếu trường author ID không đúng, không một thông báo nào liên quan đến việc bán hàng được hiển thị. Thủ tục lưu 203 This page has been intentionally left blank. 204 Thiết kế cơ sở dữ liệu và thực hành với SQL Server . Chương 14 Thủ tục lưu (Hướng dẫn thực hành) Mục đích của chương 14 Kết thúc chương 14 bạn có thể: Tạo các thủ tục lưu trong Enterprise Manager bằng wizard,. công cụ, hoặc nhấn phím F5 Thủ tục đã được thực thi , kết quả như trên hình 14. 5. Hình 14. 5: Thi hành một thủ tục lưu. 14. 1.4 Biên dịch lại thủ tục lưu . Một thủ tục lưu bắt buộc phải được biên. hình 14. 4. Hình 14. 4: Thông báo về quá trình tạo thủ tục lưu bằng Wizard. 10.Nhấn chuột vào nút OK. Hai thủ tục lưu mới tạo xuất hiện trong bên phải ô vuông mà liệt kê các thủ tục lưu. 14. 1.3 Thực