So sánh view và stored procedures
Set @Ma_lop = 8DH Set @Ma_lop = 8DH9 + Year(@Ngay_tuyen) Set @Si_so_lop = (SELECT count(*) FROM SV) Show
####### Mỗi từ khóa SET chỉ dùng gán cho một biến 9 Bi¿n trong sql server (tt) Gán giá trß cho bi¿n:Có thể gán giá trß cho biến bằng mệnh đề SELECTVí dụ 1:####### Select @Ma_lop = 8DH029, @Si_so = Ví dụ 2:####### Select @Si_so =SiSo From Lop Where Malop =8DH02 9 ####### Select @max= max(diemlan1), @min=min(diemlan1) ####### from DIEMTHI where mahocphan='sql' 10 Bi¿n trong sql server (tt) Gán giá trß cho bi¿n:Lưu ý:####### Khi gán giá trß cho biến thì giá trß phải cùng kiểu dữ ####### liệu với biến ####### Giá trß gán cho biến là kết quả câu truy vấn thì kết ####### quả cÿa câu truy vấn phải trả về đúng 1 giá trß. Ví dụ:####### Set @Ho_ten = (Select HoTen From sinhvien) lỗi: ####### ####### permitted&= 11 DECLARE @KQ INT SET @KQ= 100 PRINT N8Kết quả là: 8 PRINT @KQ PRINT N9Kết quả là 9 + Convert(NVARCHAR(10),@KQ) (Có thể dùng SELECT thay cho PRINT) 12 13 BEGIN 14 ####### Ví dụ: 15 ####### Hàm DATEPART(Đßnh dạng,9Tháng/Ngày/Năm9): ####### Lấy 1 phần (ngày, tháng, năm, ngày trong tuần, ####### ngày trong năm) cÿa ngày ####### Ví dụ: 16 SELECT DATEPART(yyyy,'02/10/1982') AS N'Năm', DATEPART(mm,'02/10/1982') AS N'Th·ng', DATEPART(dd,'02/10/1982') AS N'Ng‡y', DATEPART(DAYOFYEAR,'02/10/1982') AS N'Ngày trong năm', DATEPART(WEEKDAY,'02/10/1982') AS N'Ngày thứ' ####### Hàm DATEDIFF(Đßnh dạng, 8ngày bắt đầu9, 8ngày ####### kết thúc9): Lấy hiệu giữa hai mốc thời gian (ngày ####### kết thúc) và (ngày bắt đầu) ####### Ví dụ: 17 Select DATEDIFF (dd,'2018-10-20', '2018-10-25') as N'số ngày' 18 19 20 21 WHEN 22 ####### Nhan_vien(MaNV,HoTen,NgaySinh, Phai). Cho biết ####### những nhân viên đến tuổi về hưu biết rằng tuổi về ####### hưu cÿa nam là 60, nữ là 55) ####### Select * From Nhan_vien ####### Where datediff(yy,Ngaysinh,Getdate()) >= ####### CASE Phai ####### WHEN 8Nam9 THEN 60 ####### WHEN 8Nu9 THEN 55 ####### END 23 ####### WHEN ####### WHEN ####### & ####### WHEN ####### ELSE 24 25 26 WHILEWHILE Biểu thứcCâu lßnh hoặc nhóm lßnh đ°ợc thực thi Chú ý : Nếu trong các cấu trúc điều khiển làmột nhóm lệnh thì phải đặt nhóm lệnh đó trongcặp từ khóa BEGIN & ENDC¿u trúc while27 Ví dÿ 1:C¿u trúc while (tt) Ví dÿ 2:Cho SV(Masv:int, HoTen:nvarchar(30))Yêu cầu chèn vào bảng sinh viên một sinh viênmới sao cho mã sinh viên cÿa sinh viên chènvào đảm bảo tính liên tục từ thấp đến caoChẳng hạn ta có MaSV: 1,2,3,4,8,9,& Sinhviên mới sẽ có mã là 528 C¿u trúc while (tt) Ví dÿ 2:Cho SV(Masv: int, HoTen: nvarchar(30))&..Declare @count intSet @count = 1While exists (Select * From SV Where MaSV =@count)set @count = @count +Insert into SV(MaSV, HoTen)Values (@count, N8Lê Như Ngác9)29 C¿u trúc while (tt)BREAK: Thoát khỏi vòng lặp WHILERETURN: Chúng ta có thể dùng RETURNbất kỳ thời điểm nào để thoát khỏi thÿ tục.Các phát biểu sau RETURN sẽ khôngđược thực thi.CONTINOUS: Các câu lệnh thực thi sau từkhóa CONTINOUS trong WHILE điều đượcbỏ qua để chuyển qua vòng lặp mới.30 C¿u trúc Try..Cấu trúc Try.. trong SQL Server được dùngđể bắt lỗi tương tự như trong C# và C++.Một nhóm các lệnh được đặt trong khối Try, nếu cómột lỗi xuất hiện bên trong khối Try thì điều khiểnđược gởi đến một nhóm lệnh khác được đặt trongmột khối Catch.Chỉ có từ phiên bản SQL Server 2005.31 C¿u trúc Try.. (tt)Cấu trúc Try& Catch có cấu trúc như sau:####### BEGIN TRY ####### { ####### END TRY ####### BEGIN CATCH ####### { ####### END CATCH ####### [ ; ] 32 C¿u trúc Try..Một số thông tin về lỗi:####### ERROR_NUMBER(): Trả về mã số lỗi. ####### ERROR_SEVERITY(): Trả về māc độ cÿa lỗi. ####### ERROR_STATE(): Mã trạng thái cÿa lỗi. ####### ERROR_PROCEDURE(): Trả về tên cÿa thÿ tục ####### hay trigger xuất hiện lỗi. ####### ERROR_LINE(): Trả về số dòng bên trong thÿ tục ####### xuất hiện lỗi. ####### ERROR_MESSAGE(): Trả về dòng văn bản thông ####### báo lỗi một cách đầy đÿ. Các hàm này trả về Null nếu nó được gái bênngoài cÿa khối Catch. 33C¿u trúc Try.. (tt)Ví dụ: Điều khiển lỗi trong chia hai sốdeclare @thuong float, @sobichia float, @sochia float Select @sobichia = 3, @sochia = 0 begin try set @thuong=@sobichia/@sochia print @thuong end try begin catch SELECT ERROR_NUMBER() AS ErrorNumber, ERROR_SEVERITY() AS ErrorSeverity, ERROR_STATE() AS ErrorState, ERROR_PROCEDURE() AS ErrorProcedure, ERROR_LINE() AS ErrorLine, ERROR_MESSAGE() AS ErrorMessage; Print N'Số chia bằng không' end catch 34 C¿u trúc Try.. (tt)Ví dụ: Khi thực thi thÿ tục trên: phepchia 3 , 0ếtquả trình bày trong ngăn Results và ngănMessages như sau:35 Thā tÿc l°u trữ - (Stored Procedure)1. Giới thiệu2. Phân loại thÿ tục3. Tạo thÿ tục4. Lời gái thÿ tục5. Giá trß trả về cÿa tham số trong thÿ tục6. Phát biểu điều khiển7. Tham số với giá trß mặc đßnh8. Thÿ tục với tham số Table9. Sửa đổi thÿ tục10. Xoá thÿ tục36 Stored Procedure là gì?Là một nhóm các câu lệnh T-SQL đã được biêndßch từ trước (pre-compiled).Thực hiện một nhiệm vụ cụ thểMột Stored Procedure####### Có thể không chāa hoặc chāa nhiều tham số truyền ####### vào; ####### Có thể trả giá trß về thông qua tham số truyền cho ####### thÿ tục. 37 Stored Procedure là gì?Có 2 dạng Stored Procedure:####### System Stored Procedure ####### User-defined Stored Procedure Các System Stored Procedure có sẵn khi chúngta cài đặt SQL Server. Tất cả các SystemStored Procedure đều bắt đầu bằng tiền tố sp_38 T¿i sao dùng Stored procedure?Tăng tốc độ thực thiMô đun hóa, dễ dàng gái lạiDễ dàng nâng cấp, bảo mật.39 Phân lo¿iTrong SQL Server có 3 nhóm thÿ tục nội tại sau: Nhóm thứ nh¿t là do người dùng tạo ra.Gồm hai loại:####### Loại thÿ tục nội tại được người dùng tạo ra và lưu ####### vào CSDL. Chúng chāa các phát biểu T-SQL. ####### Loại thā hai được khai báo và tạo ra bằng ngôn ####### ngữ lập trình .NET. 40 Phân lo¿i (tt) Nhóm thứ hai là thÿ tục nội tại hệ thống thựchiện các chāc năng quản trß CSDL thườngdùng. Các thÿ tục này chāa trong CSDLResource.####### Danh sách các thÿ tục nội tại hệ thống hiển thß ####### trong ngăn System Stored Procedure ####### Thÿ tục nội tại trong CSDL Resource luôn có tên ####### với tiÁn tố là sp_. Do đó bạn không nên đặt tên ####### thÿ tục nội tại do mình tạo ra bằng tiền tố này. Nhóm thứ ba là thÿ tục nội tại hệ thống mởrộng. Loại này cũng được lưu trong CSDLResouce nhưng có tên bắt đầu với xp_.41 T¿o mßt Sroted procedureCREATE PROC [EDURE] 42 Cú pháp :T¿o mßt sroted procedure (tt)####### CREATE PROC[EDURE] ####### AS ####### [BEGIN] [DECLARE ####### [END] 43 ####### Ví dÿ 1: CREATE PROCEDURE TinhTong (@a int, @b int) ####### AS ####### Begin ####### Declare @kq int ####### Set @kq = @a + @b ####### Print @kq ####### End T¿o mßt sroted procedure (tt)####### CREATE PROC[EDURE] ####### AS ####### [BEGIN] [DECLARE ####### [END] 44 ####### Ví dÿ 2 : CREATE PROCEDURE sp_NVP (@mp int) ####### AS ####### SELECT * FROM NhanVien WHERE Maphong=@mp T¿o mßt sroted procedure (tt) Ví dÿ 3 : Viết thÿ tục in ra tổng cÿa các số từ 1..####### CREATE PROCEDURE Tinhtong (@n int) ####### AS ####### Declare @tong int, @i int ####### Select @tong=0, @i=0 ####### While @i<=@n ####### Begin ####### Set @tong=@tong+@i ####### Set @i=@i+1 ####### End ####### Print @tong ####### GO 45 T¿o mßt sroted procedure (tt) Ví dÿ 4 : Cho CSDL quản lý điểm thi như sau:46 T¿o mßt sroted procedure (tt)47 T¿o mßt sroted procedure (tt)48 T¿o mßt sroted procedure (tt)49 T¿o mßt sroted procedure (tt)50 ) Thực thi stored procedureThực thi thÿ tục bằng lời gái thÿ tục có dạng:Tên_thā_tÿc [danh_sách_các_đối_số]Lời gái thÿ tục được thực hiện bên trong một thÿtục khác, bên trong một trigger hay kết hợp với cáccâu lệnh SQL khác, sử dụng cú pháp :EXECUTE tên_thā_tÿc [danh_sách_các_đối_số]HoặcEXEC tên_thā_tÿc [danh_sách_các_đối_số]51 Thực thi stored procedure (tt)Cú pháp:EXEC[UTE] 52 Số lượng các đối và thứ tự của chúng phải phù hợp với sốlượng và thứ tự của các tham số hình thứcVí dụ 1: EXEC sp_NVP 2Ví dụ 2: EXECUTE sp_LenDanhSachDiem'CST005','Cơ sở dữ liệu',5, ‘CT002'Nếu truyền các đối không theo thứ tự thì tất cả các đốiđều phải viết dưới dạng:@tên_tham_số = giá_trịTham số trong stored procedureTham số nhập####### Là tham số phải truyền giá trß vào khi gái thÿ tục Tham số xuất (giữ lại giá trß cÿa đối số saukhi kết thúc thÿ tục)####### Là tham số nhận giá trß mà thÿ tục cần trả về, ####### Cách xây dựng tham số xuất: ####### @ Và trong lời gái thÿ tục, sau đối số đượctruyền cho thÿ tục, bạn cũng phải chỉ đßnhthêm từ khoá OUTPUT (hoặc OUT)53 Tham số trong stored procedure (tt)####### CREATE PROCEDURE ####### spCong_hai_so (@a ####### INT,@b INT, @c INT OUT) AS SELECT @c=@a+@b GO ####### Và lời gái thực thi: DECLARE @tong INT SELECT @tong=0 EXECUTE spCong_hai_so 100,200,@tong OUT Print @tong 54 ####### Ví dÿ: ####### CREATE PROCEDURE ####### spCong_hai_so (@a INT,@b ####### INT, @c INT) AS SELECT @c=@a+@b GO ####### Và lời gọi thực thi ####### DECLARE @tong INT SELECT @tong=0 EXECUTE spCong_hai_so 100,200,@tong Print @tong Tham số vßi giá trß mặc đßnhGiá trß mặc đßnh sẽ được gán cho tham số trongtrường hợp không truyền đối số cho tham số khicó lời gái đến thÿ tục.Cú pháp:####### @tên_tham_số Ví dụ: Viết thÿ tục spTestDefault như sau:55 Tham số vßi giá trß mặc đßnh (tt)CREATE PROC spTestDefault(@tenlop NVARCHAR(30) =NULL , @noisinh NVARCHAR(100) ='Hu¿‘ ) AS IF @tenlop IS NULL SELECT hodem,ten FROM sinhvien INNER JOIN lop ON sinhvien=lop WHERE noisinh like ('%'+@noisinh) ELSE SELECT hodem,ten FROM sinhvien INNER JOIN lop ON sinhvien=lop WHERE noisinh like ('%'+@noisinh) AND tenlop=@tenlop GO 56 Tham số vßi giá trß mặc đßnh (tt)Thực hiện các lời gái thÿ tục với các mục đíchkhác nhau như sau:####### Cho biết há tên cÿa các sinh viên sinh tại Huế: spTestDefault ####### Cho biết há tên cÿa các sinh viên lớp dữ liệu 2 sinh tại ####### Huế: spTestDefault @tenlop=N'dữ liệu 2' 57 Tham số vßi giá trß mặc đßnh (tt)Thực hiện các lời gái thÿ tục với các mục đíchkhác nhau như sau:####### Cho biết há tên cÿa các sinh viên sinh tại Quảng nam spTestDefault @noisinh=N'Quảng nam' ####### Cho biết há tên cÿa các sinh viên lớp đồ háa 3 sinh tại ####### Đà Nẵng: spTestTefault @tenlop=N'Đồ háa 3', @noisinh=N'Đà Nẵng' 58 Tham số Table59 Ví dÿ 1: Tham số Table (tt)Vấn đề:####### Āng dụng cho người dùng nhập đơn hàng trên Form ####### (bao gồm thông tin chung và thông tin riêng cÿa từng chi ####### tiết đơn hàng). ####### Vì tính an ninh dữ liệu, āng dụng không thể trực tiếp ####### insert dữ liệu vào các table mà phải thông qua các ####### stored procedure (SP) ####### Làm sao truyền dữ liệu trên form vào SP? Giải pháp:####### Dùng SP có tham số là table (chỉ có từ phiên bản SQL ####### Server 2008) 60 Tham số Table (tt) Ví dÿ 2:####### Cho lược đồ dữ liệu như sau: Hoadon(MaHD,MaKH,NgayLap,TongTien) CTHOADON(MaHD,MaSP,SoLuong,DonGiaBan,ThanhTie n) ####### B°ßc 1: T¿o kiểu dữ lißu bÁng t¿m để chứa các đ¡n ####### hàng từ Form truyÁn xuống: CREATE TYPE tbTamCTHD AS TABLE ( HD varchar(10), SP varchar(10), SL float, DG float, TT float ) 61 Tham số Table (tt)####### B°ßc 2: Vi¿t thā tÿc nh¿n tham số là kiểu dữ lißu ####### bÁng t¿m tbTamCTHD để đổ dữ lißu từ bÁng t¿m vào ####### bÁng thực sự tên CSDL : CREATE PROC uspNhapHD (@MaHD varchar(10), @Makh varchar(10), @Ngay Date, @CT tbTamCTHD ReadOnly) AS Declare @tt float Set @tt = (Select Sum(SL*DG) From @CT) Insert Into HoaDon Values @MaHD, @MaKH, @Ngay, @tt Update @CT Set HD = @MaHD, TT = SL * DG Insert Into CTHOADON Select * From @CT GO 62 Tham số Table (tt) B°ßc 3: Sử dÿng thā tÿc vừa vi¿t####### Declare @CT tbTamCTHD ####### Insert Into @CT Values (&) ####### Insert & ####### EXEC uspNhapHD 8HD0019, 8KH0019, 82015-8-319, @CT ####### GO 63 Thay đổi, xóa stored procedureThay đổi: Alter Proc
Xóa: Drop Proc 64 HÀMHàm là đối tượng cơ sở dữ liệu tương tự nhưthÿ tục.Điểm khác biệt giữa hàm và thÿ tục:####### Hàm trả về một giá trß thông qua tên hàm còn thÿ tục ####### thì không. 65 HÀMHàm gồm 3 lo¿i:Hàm trả về một giá trß có kiểu cơ sở nhưint, varchar, float, datetime, &Hàm trả về một table (tương tự view),thường trong làm là một câu truy vấn lấydữ liệu.Hàm trả về một table được đßnh nghĩa cấutrúc ngay trong hàm và dữ liệu có đượcnhờ thực hiện một dãy các thao tác insert66 HÀM TRÀ VÀ MÞT GIÁ TRÞCREATE FUNCTION tên_hàm ([danh_sách_tham_số])RETURNS (kiểu_cÿa_giá_trß_trả_về)ASBEGINThân hàmReturn 67 Cú phápVí dÿHàm trÁ vÁ mßt giá trß68 Ví dÿHàm trÁ vÁ mßt giá trßselect dbo(‘27/09/2017') 69CREATE FUNCTION thu (@ngay DATETIME) RETURNS NVARCHAR( 10 ) AS BEGIN DECLARE @tt NVARCHAR( 10 ) SELECT @tt= CASE DATEPART(DW,@ngay) WHEN 1 THEN N'Chủ nhật' WHEN 2 THEN N'Thứ hai' WHEN 3 THEN N'Thứ ba' WHEN 4 THEN N'Thứ tư' WHEN 5 THEN N'Thứ năm' WHEN 6 THEN N'Thứ sáu' ELSE N'Thứ bảy' END RETURN (@tt)/* Giá Trị trả về của hàm*/ END Ví dÿHàm trÁ vÁ mßt giá trßViết hàm tính số ngày cÿa một tháng.70 Hàm trÁ vÁ mßt bÁng (t°¡ng tự view)CREATE FUNCTION
|