Bài tập 2: Thực thi dữ liệu và Stored Procedure trong SQL Server
Thực hiện bài thực hành theo các yêu cầu sau:
- Dùng câu lệnh bcp để export tất cả dữ liệu từ bảng DatHang của CSDL QLBanHang (trong bài thực hành 1) tới c:\DatHang.txt (hoặc c:\DatHang.csv)
- Thay đổi một vài dữ liệu trong file c:\DatHang.txt và lưu lại. Rồi import tới bảng DatHang từ file text này sử dụng câu lệnh bcp
- Import DatHang.txt tới bảng DatHang sử dụng BULK INSERT
- Tạo một Linked Server với tên ‘LinkedQLKhachHang’ mà sẽ liên kết tới cơ sở dữ liệu Access có tên ‘QLKhachHang.mdb’ (trước tiên bạn cần tạo một CSDL có tên là QLKhachHang bằng phần mềm Access tương tự như bài tập 1 và nhập dữ liệu vào). Rồi thực hiện việc select dữ liệu sử dụng và thực hiện OPENQUERY
- Sử dụng mô hình kết nối máy tính ad-hoc với các chức năng OPENROWSET và OPENDATASOURCE để select dữ liệu từ ‘QLKhachHang.mdb’
- Tạo Cursor sau
DECLARE @au_lname varchar(40), @au_fname varchar(20)
DECLARE Employee_Cursor CURSOR FOR
SELECT LastName, FirstName FROM Northwind.dbo.Employees
OPEN Employee_Cursor
FETCH NEXT FROM Employee_Cursor INTO @au_lname, @au_fname
WHILE @@FETCH_STATUS = 0
BEGIN
PRINT 'Author:' + @au_fname + ' ' + @au_lname
FETCH NEXT FROM Employee_Cursor INTO @au_lname, @au_fname
END
CLOSE Employee_Cursor
DEALLOCATE Employee_Cursor
- Tạo Stored Procedure sau và thử thực thi với một vài giá trị
CREATE PROCEDURE AddNewDatHang
@IdDatHang smallint,
@TenSP varchar(50),
@TenKH varchar(50),
@KetQua smallint=1 Output
AS
DECLARE @IdKhachHang smallint
BEGIN TRANSACTION
If not Exists(SELECT IdKhachHang FROM KhachHang WHERE [Ten]=@TenKH)
BEGIN
SET @IdKhachHang= (SELECT Max(IdKhachHang) FROM KhachHang)
SET @IdKhachHang=@IdKhachHang+1
INSERT INTO KhachHang VALUES(@IdKhachHang,@TenKH)
If Exists(SELECT IdDatHang FROM [DatHang] WHERE IdDatHang=@IdDatHang)
BEGIN
SELECT @KetQua=1
ROLLBACK TRANSACTION
END
Else
BEGIN
INSERT INTO [DatHang](IdDatHang,TenSP,IdKhachHang) VALUES(@IdDatHang,@TenSP,@IdKhachHang)
SELECT @KetQua=0 COMMIT TRANSACTION
END
END
Else
BEGIN
If Exists(SELECT IdDatHang FROM [DatHang] WHERE IdDatHang=@IdDatHang)
BEGIN
SELECT @KetQua=1 ROLLBACK TRANSACTION
END
Else
BEGIN
INSERT INTO [DatHang](IdDatHang,TenSP,IdKhachHang) VALUES(@IdDatHang,@TenSP,@IdKhachHang)
SELECT @KetQua=0 COMMIT TRANSACTION
END
END
Print @KetQua Return
- Sử dung ngôn ngữ lập trình C# hoặc VB.NET để thực thi Stored Procedure ‘AddNewOrder’, Tham khảo thêm bài viết lập trình CSDL với C# và bài giảng lập trình CSDL với ADO.NET
2 phản hồi
[…] Trong ví dụ ở trên trước hết ta khai báo một biến @CustomerID sau đó bắt đầu một transaction bằng BEGIN TRANSACTION (toàn bộ công việc insert này được thực hiện trong một Transaction nghĩa là hoặc là insert thành công hoặc là không làm gì cả – all or nothing). Trước hết ta kiểm tra xem người khách hàng là người mới hay cũ. Nếu là người mới thì ta “tiện tay” insert vào bảng Customers luôn còn nếu không thì chỉ insert vào bảng Orders mà thôi. Nếu là người customer mới ta lấy CustomerID lớn nhất từ bảng Customers bỏ vào biến @CustomerID và sau đó tăng lên một đơn vị dùng cho việc Insert Customer ở dòng kế tiếp. Sau khi insert khách hàng mới mới ta tiếp tục công việc bằng việc kiểm tra xem Order muốn insert đã tồn tại chưa (vì nếu order đã tồn tại thì khi insert SQL Server sẽ báo lỗi do OrderID là Primary key). Nếu như order trên vì lý do nào đó đã có trong DB thì ta roll back và trả kết quả =1 còn nếu không thì ta insert một order mới vào và commit transaction với kết quả trả về =0. Tương tự như vậy nếu khách hàng đã tồn tại (sau chữ else đầu tiên) thì ta chỉ việc insert order giống như trên. Trong mọi trường hợp kể trên ta đều in ra kết quả và return. Ví dụ trên đây chỉ mang tính học hỏi còn trên thực tế database có thể phức tạp hơn nhiều nên việc viết stored procedure đòi hỏi kiến thức vững chắc về SQL và kỹ năng về lập trình. Muốn hiểu rõ hơn về bài học này bạn cần làm bài tập số 2. […]
[…] NGuồn: https://timoday.edu.vn/bai-tap-2-thuc-thi-du-lieu-va-stored-procedure-trong-sql-server/ […]