Bài Tập Function Sql Có Lời Giải / Top 9 Xem Nhiều Nhất & Mới Nhất 9/2023 # Top Trend | Ictu-hanoi.edu.vn

Sql Server – Function Và Trigger

Trong bài trước mình đã giới thiệu về Stored Procedure , Trong bài này chúng ta sẽ tìm hiểu về Function và Trigger – một phần cũng không kém phần quan trong trong lập trình với cơ sở dữ liệu

1. Hàm – Functions

Cũng giống như Stored Procedure Hàm là một đối tượng trong cơ sở dữ liệu bao gồm một tập nhiều câu lệnh SQL được nhóm lại với nhau thành một nhóm. Điểm khác biệt giữa hàm và thủ tục là hàm trả về một giá trị thông qua tên hàm. Điều này cho phép ta sử dụng hàm như là một thành phần của một biểu thức chẳng hạn như trong các câu lệnh truy vấn hay các câu lệnh thực hiện cập nhật dữ liệu

Trong SQL có rất nhiều các hàm được định nghĩa sẵn (Được chia theo nhóm – Trong 1 Database bạn chọn Programmability/Functions/System Functions) như các hàm về chuỗi (String Functions), các hàm về ngày tháng (Date and Time Functions), Các hàm toán học (Mathematical Function), … Ngoài những hàm do hệ quản trị cơ sở dữ liệu cung cấp sẵn, bạn có thể tự xây dựng các hàm nhằm phục vụ cho mục đích riêng của mình – Các hàm do người dùng định nghĩa. Các hàm do người dùng định nghĩa thường có 2 loại: Loại 1 là Hàm với giá trị trả về là “dữ liệu kiểu bảng” – Table-valued Functions; Loại 2 là Hàm với giá trị trả về là một giá trị – Scalar-valued Functions và các hàm này cũng sẽ được Hệ quản trị phân thành 2 nhóm.

Các hàm sẵn có của SQL bạn tự tìm hiểu và sử dụng, trong bài viết này mình giới thiệu qua về những hàm “Do người dùng định nghĩa”.

Cú pháp của hàm như sau:

CREATE FUNCTION Ten_Ham ( [Danh_Sach_Cac_Tham_So] )  RETURNS Kieu_Du_Lieu_Tra_Ve_Cua_Ham AS  BEGIN    Cac_Cau_Lenh_Cua_Ham END

– Ten_Ham: Tên của hàm cần tạo. Tên phải tuân theo qui tắc định danh và không trùng với tên của các hàm hệ thống có sắn. – Danh_Sach_Cac_Tham_So: Các tham số của hàm được khai báo ngay sau tên hàm và được bao bởi cặp dấu (), Danh sách các tham số này có thể không có – trường hợp này thì sau tên hàm bạn cần có cặp dấu (). Nếu hàm có nhiều tham số thì các khai báo phân cách nhau bởi dấu phẩy và phải bao hồm 2 phần: Tên tham số được bắt đầu bởi dấu @, Kiểu dữ liệu của tham số – Cac_Cau_Lenh_Cua_Ham: Tập hợp các câu lệnh sử dụng trong nội dung hàm để thực hiện các yêu cầu của hàm.

Ví dụ 1: Mình sẽ lấy một ví dụ thật đơn giản là hàm không có Danh_Sach_Cac_Tham_So – trả về giá trị là năm hiện hành (Theo giờ hệ thống trên máy Database server):

CREATE  FUNCTION dbo.fuGetCurrYear ()  RETURNS int AS  BEGIN  RETURN   YEAR(getdate()) END

Xem ví dụ trên bạn sẽ thấy nó rất đơn giản nhưng qua đây bạn cũng đã biết được việc viết hàm trong SQL như thế nào.

Ví dụ 2: Tiếp theo mình sẽ viết một ví dụ nữa để bạn hiểu và có thể viết cho mình các hàm tự định nghĩa:

 CREATE  FUNCTION dbo.fuDaysInMonth (  @Thang Int,  @Nam  Int )  RETURNS int AS  BEGIN    DECLARE @Ngay Int  IF @Thang = 2   BEGIN     OR (@Nam % 400 = 0))     SET @Ngay = 29    ELSE     SET @Ngay = 28   END  ELSE   SELECT @Ngay =     CASE @Thang     WHEN 1 THEN 31     WHEN 3 THEN 31     WHEN 5 THEN 31     WHEN 7 THEN 31     WHEN 8 THEN 31     WHEN 10 THEN 31     WHEN 12 THEN 31     WHEN 4 THEN 30     WHEN 6 THEN 30     WHEN 9 THEN 30     WHEN 11 THEN 30    END  RETURN @Ngay END

Ví dụ 3: Bạn xem tiếp ví dụ sau để xác định thứ trong tuần của một giá trị kiểu ngày

CREATE FUNCTION fuThu (  @ngay DATETIME ) RETURNS NVARCHAR(10) AS      BEGIN           DECLARE @KetQua NVARCHAR(10)           SELECT @KetQua=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 (@KetQua)  /* Trị trả về của hàm */ END

SELECT e.FirstName, e.LastName, dbo.fuThu(e.BirthDate) AS ThuOfBirth  FROM Employees e

Tiếp theo mình sẽ nói về Hàm với giá trị trả về là “dữ liệu kiểu bảng” Nếu đã biết về SQL chắc hẳn bạn đã biết cách tạo View từ các bảng trong CSDL, Nhưng với View bạn không thể truyền các tham số được, điều này phần nào đó làm giảm tính linh hoạt trong việc sử dụng View. Vậy nên khi bạn cần sử dụng dữ liệu dạng View mà có các tham số thì việc sử dụng hàm là một giải pháp hợp lý nhất. Ví dụ 4: Giả sử Mình tạo 1 View như sau: 

 CREATE VIEW vProducts  as  SELECT      Categories.CategoryID,  Categories.CategoryName,  Products.ProductName,  Products.QuantityPerUnit,  Products.UnitPrice FROM          Categories INNER JOIN  Products ON Categories.CategoryID = Products.CategoryID  WHERE Categories.CategoryID=1

Ví dụ 5: Tạo một hàm trả về dữ liệu dạng bảng tùy theo giá trị của biến @CategoryID truyền vào:

CREATE FUNCTION fuGetProducts (  @CategoryID int )RETURNS TABLE  AS   RETURN   (    SELECT       Categories.CategoryID,   Categories.CategoryName,   Products.ProductName,   Products.QuantityPerUnit,   Products.UnitPrice  FROM           Categories INNER JOIN   Products ON Categories.CategoryID = Products.CategoryID   WHERE Categories.CategoryID=@CategoryID)

chạy thử hàm trên(Chú ý là khi hàm trả về dạng bảng bạn cũng coi đó như 1 table hoặc 1 View và bạn có thể truy vấn theo 1 hay nhiều trường của hàm) như sau:  

SELECT CategoryID, CategoryName, ProductName, QuantityPerUnit, UnitPrice FROM  dbo.fuGetProducts(1)

Sẽ tra về dữ liệu chính là Select * from vProducts ở trên. Nếu muốn lầy Theo CategoryID=2 bạn dùng câu lệnh Select * from dbo.fuGetProducts(2)…

Tổng Hợp 10 Bài Tập Truy Vấn Sql Có Lời Giải Hay Cho Học Sinh

Tổng hợp bài tập truy vấn SQL có lời giải hay :

Câu hỏi 1 : Để quản lý Thực tập nghề nghiệp của sinh viên, người ta xây dựng một cơ sở dữ liệu có tên là ThucTap gồm các sơ đồ quan hệ sau:

Khoa(makhoa char(10), tenkhoa char(30), dienthoai char(10))GiangVien(magv int, hotengv char(30), luong decimal(5,2), makhoa char(10))SinhVien(masv int, hotensv char(30), makhoa char(10), namsinh int, quequan char(30))DeTai(madt char(10), tendt char(30), kinhphi int, NoiThucTap char(30))HuongDan(masv int, madt char(10), magv int, ketqua decimal(5,2))

Các lệnh SQL tạo bảng Đầu tiên bạn cần thực hiện lệnh tạo Data Base trước như sau : Nhập dữ liệu cho từng bảng : Thêm dữ liệu vào bảng Khoa :

Thêm dữ liệu vào bảng Giảng Viên :

Thêm dữ liệu vào bảng SInh Viên : Thêm dữ liệu vào bảng Đề Tài : Thêm dữ liệu vào bảng Hướng Dẫn :

Câu hỏi 2 : Cũng cùng nội dung câu hỏi trên bạn hãy đưa ra thông tin gồm mã số, họ tên và tên khoa của tất cả các giảng viên .

SELECT GV.Magv, GV.Hotengv, K.Tenkhoa

Câu hỏi 3 : Sử dụng lệnh xuất ra mã số, họ tên, tên khoa của các giảng viên hướng dẫn từ 3 sinh viên trở lên.

Câu hỏi 4 : Sử dụng lệnh SQL để xuất ra thông tin về những sinh viên chưa có điểm thực tập .

Câu hỏi 5 : Thực hiện lệnh SQL xuất ra số điện thoại của khoa mà sinh viên có tên ‘Le van son’ đang theo học .

Câu hỏi 6 : Sử dụng lệnh truy vấn SQL lấy ra mã số và tên các đề tài có nhiều hơn 2 sinh viên tham gia thực tập .

Câu hỏi 7 : Sử dụng câu lệnh truy vấn SQL lấy ra mã số, tên đề tài của đề tài có kinh phí cao nhất .

Câu hỏi 8 : Sử dụng câu lệnh SQL xuất ra Tên khoa, Số lượng sinh viên của mỗi khoa .

Câu hỏi 9 : Sử dụng truy vấn SQL xuất ra mã số, họ tên và điểm của các sinh viên khoa ‘DIALY và QLTN’ .

SELECT SV.Masv,SV.Hotensv,HD.KetQua

Câu hỏi 10 : Sử dụng câu lệnh SQL xuất ra danh sách gồm Mã số, Họ tên và Tuổi của các sinh viên khoa ‘TOAN’ .

Bài Tập Sql Cơ Bản

Bài 1: Để quản lý Thực tập nghề nghiệp của sinh viên, người ta xây dựng một cơ sở dữ liệu có tên là ThucTap gồm các sơ đồ quan hệ sau:

Khoa(makhoa char(10), tenkhoa char(30), dienthoai char(10))GiangVien(magv int, hotengv char(30), luong decimal(5,2), makhoa char(10))SinhVien(masv int, hotensv char(30), makhoa char(10), namsinh int, quequan char(30))DeTai(madt char(10), tendt char(30), kinhphi int, NoiThucTap char(30))HuongDan(masv int, madt char(10), magv int, ketqua decimal(5,2))

A. Sử dụng SSMS để tạo lập và nhập dữ liệu cho CSDL B. Chỉ sử dụng 01 lệnh SQL trả lời các yêu cầu sau: I

Đưa ra thông tin gồm mã số, họ tênvà tên khoa của tất cả các giảng viên

Đưa ra thông tin gồm mã số, họ tênvà tên khoa của các giảng viên của khoa ‘DIA LY va QLTN’

Cho biết số sinh viên của khoa ‘CONG NGHE SINH HOC’

Đưa ra danh sách gồm mã số, họ tênvà tuổi của các sinh viên khoa ‘TOAN’

Cho biết số giảng viên của khoa ‘CONG NGHE SINH HOC’

Cho biết thông tin về sinh viên không tham gia thực tập

Đưa ra mã khoa, tên khoa và số giảng viên của mỗi khoa

Cho biết số điện thoại của khoa mà sinh viên có tên ‘Le van son’ đang theo học

II

Cho biết mã số và tên của các đề tài do giảng viên ‘Tran son’ hướng dẫn

Cho biết tên đề tài không có sinh viên nào thực tập

Cho biết mã số, họ tên, tên khoa của các giảng viên hướng dẫn từ 3 sinh viên trở lên.

Cho biết mã số, tên đề tài của đề tài có kinh phí cao nhất

Cho biết mã số và tên các đề tài có nhiều hơn 2 sinh viên tham gia thực tập

Đưa ra mã số, họ tên và điểm của các sinh viên khoa ‘DIALY và QLTN’

Đưa ra tên khoa, số lượng sinh viên của mỗi khoa

Cho biết thông tin về các sinh viên thực tập tại quê nhà

Hãy cho biết thông tin về những sinh viên chưa có điểm thực tập

Đưa ra danh sách gồm mã số, họ tên các sinh viên có điểm thực tập bằng 0

Ok xong phần bài tập sql cơ bản nha !!! Cái này làm nhiều ắt sẽ quen tay, mà cái nào chả vậy 😀

Cho đi kiến thức bạn đang có là cách tuyệt vời để nâng cao trình độ của bản thân!

Một Số Bài Tập Mẫu Sql(Phân I)

Khách hàng đặt hàng cho cty thông qua các đơn đặt hàng. Thông tin chung về các đơn đạt hàng được lưu trữ trong DONDATHANG (mỗi một đơn đặt hàng phải do một nhân viên của cty lập và do đó bảng này có quan hệ với bảng NHANVIEN)

Thông tin chi tiết của các đơn đặt hàng (đặt mua hàng gì, số lượng, giá cả, …) được lưu trữ chi tiết trong bảng CHITIETDATHANG. Bảng này có quan hệ với DONDATHANG và MATHANG.

Sử dụng câu lệnh sau để tạo cơ sở dữ liệu:

/*2. Những đơn đặt hàng nào yêu cầu giao hàng ngay tại cty đặt hàng và những đơn đó là của công ty nào? */

/*3. Những mặt hàng nào chưa từng được khách hàng đặt mua?*/

/*4. Những nhân viên nào của công ty chưa từng lập bất kỳ một hoá đơn đặt hàng nào? */

/*5. Trong năm 2003, những mặt hàng nào chỉ được đặt mua đúng một lần*/

/*6. Hãy cho biết mỗi một khách hàng đã phải bỏ ra bao nhiêu tiền để đặt mua hàng của công ty? */

/*7. Mỗi một nhân viên của công ty đã lập bao nhiêu đơn đặt hàng (nếu nhân viên chưa hề lập một hoá đơn nào thì cho kết quả là 0) */

/*8. Cho biết tổng số tiền hàng mà cửa hàng thu được trong mỗi tháng của năm 2003 (thời được gian tính theo ngày đặt hàng). */

/*9. Hãy cho biết tổng số lượng hàng của mỗi mặt hàng mà cty đã có (tổng số lượng hàng hiện có và đã bán). */

/*10. Nhân viên nào của cty bán được số lượng hàng nhiều nhất và số lượng hàng bán được của nhân viên này là bao nhiêu?*/

/*11. Mỗi một đơn đặt hàng đặt mua những mặt hàng nào và tổng số tiền mà mỗi đơn đặt hàng phải trả là bao nhiêu? */

/*12. Hãy cho biết mỗi một loại hàng bao gồm những mặt hàng nào, tổng số lượng hàng của mỗi loại và tổng số lượng của tất cả các mặt hàng hiện có trong công ty là bao nhiêu? */

/*13. Thống kê xem trong năm 2003, mỗi một mặt hàng trong mỗi tháng và trong cả năm bán được với số lượng bao nhiêu.*/

/*14. Cập nhật lại giá trị NGAYCHUYENHANG của những bản ghi có giá trị NGAYCHUYENHANG chưa xác định (NULL) trong bảng DONDATHANG bằng với giá trị của trường NGAYDATHANG.*/

/*15. Cập nhật giá trị của trường NOIGIAOHANG trong bảng DONDATHANG bằng địa chỉ của khách hàng đối với những đơn đặt hàng chưa xác định được nơi giao hàng (có giá trị trường NOIGIAOHANG bằng NULL)*/

/*16. Cập nhật lại dữ liệu trong bảng KHACHHANG sao cho nếu tên công ty và tên giao dịch của khách hàng trùng với tên công ty và tên giao dịch của một nhà cung cấp nào đó thì địa chỉ, điện thoại, fax và email phải giống nhau.*/

/*17. Tăng lương lên gấp rưỡi cho những nhân viên bán được số lượng hàng nhiều hơn 100 trong năm 2003 */

*18. Tăng phụ cấp lên bằng 50% lương cho những nhân viên bán được hàng nhiều nhất.*/

/*19. Giảm 25% lương của những nhân viên trong năm 2003 ko lập được bất kỳ đơn đặt hàng nào */

/*20. Giả sử trong bảng DONDATHANG có them trường SOTIEN cho biết số tiền mà khách hàng phải trả trong mỗi dơn đặt hàng. Hãy tính giá trị cho trường này.*/

/*21. Xoá khỏi bảng MATHANG những mặt hàng có số lượng bằng 0 và không được đặt mua trong bất kỳ đơn đặt hàng nào.*/

Một Số Bài Tập Mẫu Sql(Phần Iii)

CREATE TABLE [dbo].[SalesPerson]( [SlsPerID] [varchar](30) NOT NULL, [Name] [varchar](30) NULL, CONSTRAINT [pk_salesperson] PRIMARY KEY CLUSTERED )WITH (IGNORE_DUP_KEY = OFF) ON [PRIMARY] IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[Inventory]’) AND type in (N’U’)) CREATE TABLE [dbo].[Inventory]( [InvtID] [varchar](30) NOT NULL, [Descr] [varchar](30) NULL, [StkBasePrc] [varchar](30) NULL, CONSTRAINT [pk_inventory] PRIMARY KEY CLUSTERED )WITH (IGNORE_DUP_KEY = OFF) ON [PRIMARY] IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[fncQuy]’) AND type in (N’FN’, N’IF’, N’TF’, N’FS’, N’FT’)) execute dbo.sp_executesql @statement = N’CREATE FUNCTION [dbo].[fncQuy](@ngay DATETIME) RETURNS INT AS BEGIN DECLARE @thang INT, @quy INT SET @thang = month(@ngay) IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[Customer]’) AND type in (N’U’)) CREATE TABLE [dbo].[Customer]( [CustID] [varchar](30) NOT NULL, [Name] [varchar](30) NULL, CONSTRAINT [pk_customer] PRIMARY KEY CLUSTERED )WITH (IGNORE_DUP_KEY = OFF) ON [PRIMARY] IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[xswSalesOrd]’) AND type in (N’U’)) CREATE TABLE [dbo].[xswSalesOrd]( [OrderNbr] [int] NOT NULL, [OrderDate] [datetime] NULL, [SlsPerID] [varchar](30) NULL, [CustID] [varchar](30) NULL, CONSTRAINT [pk_ordernbr] PRIMARY KEY CLUSTERED )WITH (IGNORE_DUP_KEY = OFF) ON [PRIMARY] IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[xswSlsOrdDet]’) AND type in (N’U’)) CREATE TABLE [dbo].[xswSlsOrdDet]( [OrderNbr] [varchar](30) NOT NULL, [InvtID] [varchar](30) NULL, CONSTRAINT [pk_xswslsorddet] PRIMARY KEY CLUSTERED )WITH (IGNORE_DUP_KEY = OFF) ON [PRIMARY] IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[Hienthi]’) AND type in (N’FN’, N’IF’, N’TF’, N’FS’, N’FT’)) execute dbo.sp_executesql @statement = N’create function [dbo].[Hienthi](@SlsPerID nvarchar(10)) returns nvarchar(10) as begin declare @hienthi nvarchar(10) declare @name nvarchar(50) select @name = name from SalesPerson where @SlsPerID= SlsPerID from Customer where Name = @name) SET @hienthi = N”không” IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[sp_HienThiDoanhSoCuaNhanVien2010]’) AND type in (N’P’, N’PC’)) EXEC dbo.sp_executesql @statement = N’create PROCEDURE [dbo].[sp_HienThiDoanhSoCuaNhanVien2010] DECLARE contro CURSOR FOR select s.SlsPerID, s.Name, isnull(sum(x.OrdAmt), 0) as OrdAmt from xswSalesOrd x right join SalesPerson s on x.SlsPerID = s.SlsPerID where Year(x.OrderDate) = 2010 or x.OrderDate IS NULL group by s.SlsPerID, s.Name OPEN contro DECLARE @SlsPerID NVARCHAR(10) DECLARE @Name NVARCHAR(50) DECLARE @OrdAmt money declare @HienThi nvarchar(100) /*Bắt đầu duyệt qua các dòng trong kết quả truy vấn*/ FETCH NEXT FROM contro INTO @SlsPerID,@Name,@OrdAmt WHILE @@FETCH_STATUS=0 set @HienThi = N”Không Đạt Yêu Cầu Doanh Số” set @HienThi = N”Đạt Yêu Cầu Doanh Số” INSERT INTO #temp(SlsPerID, Name, OrdAmt, HienThi) SELECT @SlsPerID, @Name, @OrdAmt, @HienThi FETCH NEXT FROM contro INTO @SlsPerID,@Name,@OrdAmt /*Đóng con trỏ và giải phóng vùng nhớ*/ CLOSE contro DEALLOCATE contro select * from #temp drop table #temp IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[fncTinhChietKhau]’) AND type in (N’FN’, N’IF’, N’TF’, N’FS’, N’FT’)) execute dbo.sp_executesql @statement = N’CREATE FUNCTION [dbo].[fncTinhChietKhau](@giaBan MONEY, @ngayBan DATETIME) SET @chietKhau = CASE dbo.fncQuy(@ngayBan) WHEN 1 THEN @giaBan*0.1 IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[danhsachkhachhang]’) AND type in (N’P’, N’PC’)) EXEC dbo.sp_executesql @statement = N’create proc [dbo].[danhsachkhachhang] (@startDate varchar(10)=null, @endDate varchar(10)=null) select @Start=Convert(datetime,@startDate,103) select @End=Convert(datetime,@endDate,103) print ”Loi: Ngay bat dau lon hon ngay ket thuc.”; SELECT xswSalesOrd.CustID, month(OrderDate) AS Thang, COUNT(xswSalesOrd.CustID) AS SoLanMuaHang FROM Customer INNER JOIN xswSalesOrd ON Customer.CustID=xswSalesOrd.CustID WHERE ((xswSalesOrd.OrderDate) BETWEEN @Start AND @End) GROUP BY xswSalesOrd.CustID,Month(OrderDate) IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[danhsachmathang2010]’) AND type in (N’P’, N’PC’)) EXEC dbo.sp_executesql @statement = N’create proc [dbo].[danhsachmathang2010] select @Start=Convert(datetime,”01-Jan-2010”,103) select @End=Convert(datetime,”31-Mar-2010”,103) select top 10 xswSlsOrdDet.InvtID, sum (LineAmt) as doanhso from (xswSalesOrd inner join xswSlsOrdDet on xswSalesOrd.OrderNbr= xswSlsOrdDet.OrderNbr) where ((OrderDate) between @Start and @End) group by xswSlsOrdDet.InvtID order by sum(LineAmt) desc IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[fncChietKhauCuaMatHang]’) AND type in (N’FN’, N’IF’, N’TF’, N’FS’, N’FT’)) execute dbo.sp_executesql @statement = N’CREATE FUNCTION [dbo].[fncChietKhauCuaMatHang](@maHang NVARCHAR(10), @maDonHang NVARCHAR(10)) DECLARE @chietKhau MONEY, SELECT @ngayBan = OrderDate WHERE OrderNbr = @maDonHang WHERE OrderNbr = @maDonHang AND InvtID = @maHang SET @chietKhau = dbo.fncTinhChietKhau(@giaBan, @ngayBan) IF NOT EXISTS (SELECT * FROM sys.foreign_keys WHERE object_id = OBJECT_ID(N'[dbo].[fk1]’) AND parent_object_id = OBJECT_ID(N'[dbo].[xswSalesOrd]’)) ALTER TABLE [dbo].[xswSalesOrd] WITH CHECK ADD CONSTRAINT [fk1] FOREIGN KEY([SlsPerID]) REFERENCES [dbo].[SalesPerson] ([SlsPerID]) IF NOT EXISTS (SELECT * FROM sys.foreign_keys WHERE object_id = OBJECT_ID(N'[dbo].[fk2]’) AND parent_object_id = OBJECT_ID(N'[dbo].[xswSalesOrd]’)) ALTER TABLE [dbo].[xswSalesOrd] WITH CHECK ADD CONSTRAINT [fk2] FOREIGN KEY([CustID]) REFERENCES [dbo].[Customer] ([CustID]) IF NOT EXISTS (SELECT * FROM sys.foreign_keys WHERE object_id = OBJECT_ID(N'[dbo].[fk3]’) AND parent_object_id = OBJECT_ID(N'[dbo].[xswSlsOrdDet]’)) ALTER TABLE [dbo].[xswSlsOrdDet] WITH CHECK ADD CONSTRAINT [fk3] FOREIGN KEY([InvtID]) REFERENCES [dbo].[Inventory] ([InvtID]) Câu 1:

Hiển thị danh sách nhân viên bán hàng gồm:

Chú ý: viết user-function để nhận biết nhân viên và khách hàng.

Câu 2:

Viết Store-procedure hiển thị danh sách nhân viên bán hàng cùng doanh số bán hàng trong năm 2010, trường hợp có doanh số <=100 triệu thì hiển thị “Ko đạt yêu cầu doanh số”, ngược lại hiển thị “Đạt yêu cầu doanh số”.

Chú ý: sử dụng cursor.

Câu 3:

Viết user-function để tính toán chiết khấu cho mã hàng trong tất cả các đơn hàng trong năm 2010, mã hàng được truyền vào thông qua tham số của function.

Cụ thể như sau:

Chú ý: giá trị chiết khấu sau khi tính toán được update vào trường User3 trong table xswSlsOrdDet. Sử dụng transaction.

–Them Column User3 vao table xswSlsOrdDet

— Bắt đầu cập nhật BEGIN TRAN

Câu 4:

Viết store-procedure liệt kê 10 mặt hàng có doanh số cao nhất trong khoảng thời gian từ 01-Jan-2010 đến hết 31-Mar-2010.

Câu 5:

Viết store-procedure hiển thị danh sách những khách hàng có số lần mua hàng trong từng tháng bằng với giá trị truyền vào thông qua tham số của store-procedure trong khoảng thời gian từ ngày đến ngày cũng được truyền vào qua tham số của store-procedure.