Các ứng dụng cơ sở dữ liệu trong thế giới thực cần thực hiện nhiều yêu cầu từ giao diện người dùng đến cơ sở dữ liệu để thực hiện tất cả các loại chức năng.
Nếu một ứng dụng sử dụng nhiều dữ liệu, chẳng hạn như những ứng dụng được sử dụng trong ngân hàng hoặc sân bay, v.v., số lượng các chuyến đi dữ liệu có thể rất lớn. Mỗi yêu cầu đến cơ sở dữ liệu sử dụng băng thông và cần thời gian để thực thi. Nếu không có các tham số giá trị bảng, ứng dụng phía trước cần thực hiện nhiều chuyến đi dữ liệu để thao tác với nhiều hàng dữ liệu. Tuy nhiên, với các tham số có giá trị bảng, nhiều hàng có thể được chèn, cập nhật và xóa khỏi cơ sở dữ liệu bằng cách sử dụng một lệnh được tham số hóa duy nhất nhận tham số có giá trị bảng.
Tham số có giá trị bảng là một tham số có kiểu bảng. Sử dụng tham số này, bạn có thể gửi nhiều hàng dữ liệu tới một thủ tục được lưu trữ hoặc một lệnh SQL được tham số hóa ở dạng bảng. Transact-SQL có thể được sử dụng để truy cập các giá trị cột của các tham số có giá trị bảng.
Trong bài này, chúng ta sẽ nghiên cứu cách chúng ta có thể chuyển một bảng dữ liệu vào một thủ tục được lưu trữ. Tuy nhiên, trước đó, hãy xem cách dữ liệu dạng bảng được sử dụng để được chuyển trước các tham số có giá trị bảng.
Truyền dữ liệu ở dạng bảng trước các tham số có giá trị trong bảng
Các tham số giá trị bảng đã được giới thiệu trong SQL Server 2008. Trước đó, có các tùy chọn hạn chế để chuyển dữ liệu dạng bảng tới các thủ tục được lưu trữ. Hầu hết các nhà phát triển đã sử dụng một trong các phương pháp sau:
- Dữ liệu trong nhiều cột và hàng được biểu diễn dưới dạng một loạt các tham số. Tuy nhiên, số lượng tham số tối đa có thể được truyền cho một thủ tục được lưu trữ trên SQL Server là 2.100. Vì vậy, trong trường hợp một bảng lớn, phương pháp này không thể được sử dụng. Hơn nữa, cần phải xử lý trước ở phía máy chủ để định dạng các thông số riêng lẻ thành dạng bảng.
- Tạo nhiều câu lệnh SQL có thể ảnh hưởng đến nhiều hàng, chẳng hạn như CẬP NHẬT. Các câu lệnh có thể được gửi đến máy chủ riêng lẻ hoặc ở dạng hàng loạt. Ngay cả khi chúng được gửi ở dạng hàng loạt, các câu lệnh vẫn được thực thi riêng lẻ trên máy chủ.
- Một cách khác là sử dụng các chuỗi được phân tách hoặc tài liệu XML để nhóm dữ liệu từ nhiều hàng và cột, sau đó chuyển các giá trị văn bản này đến các câu lệnh SQL được tham số hóa hoặc các thủ tục được lưu trữ. Hạn chế của phương pháp này là bạn cần xác thực cấu trúc dữ liệu để tách các giá trị.
Chuyển bảng Dữ liệu làm Tham số cho Thủ tục Đã Lưu trữ
Bây giờ, hãy xem cách các tham số có giá trị bảng có thể được sử dụng để gửi dữ liệu đến một thủ tục được lưu trữ mà không gặp phải bất kỳ vấn đề nào được thảo luận trong phần trước. Các tham số có giá trị bảng cho phép nhiều hàng dữ liệu được chuyển đến một thủ tục được lưu trữ bằng một số mã Transact-SQL hoặc từ ứng dụng front-end. Kích thước tối đa mà tham số có giá trị bảng có thể có bằng kích thước bộ nhớ tối đa của máy chủ cơ sở dữ liệu.
Trong phần này, chúng tôi sẽ sử dụng các tham số có giá trị bảng cùng với một thủ tục được lưu trữ để chèn nhiều hàng vào một bảng dữ liệu.
Chuyển các tham số có giá trị bảng vào một thủ tục được lưu trữ là một quy trình gồm ba bước:
- Tạo loại bảng do người dùng xác định tương ứng với bảng mà bạn muốn điền.
- Chuyển bảng do người dùng xác định tới thủ tục được lưu trữ dưới dạng tham số
- Bên trong quy trình đã lưu trữ, hãy chọn dữ liệu từ tham số đã truyền và chèn nó vào bảng mà bạn muốn điền.
Hãy cùng xem một ví dụ về cách chúng ta có thể chuyển một bảng dữ liệu sang một thủ tục được lưu trữ bằng cách sử dụng hàm giá trị bảng.
Đầu tiên, hãy tạo một bảng mà chúng ta muốn điền. Thực thi tập lệnh sau:
CREATE DATABASE ShowRoom USE ShowRoom Create Table Cars ( Id int primary key, Name nvarchar(50), company nvarchar(50) ) Go
Trong đoạn mã ở trên, chúng tôi tạo một cơ sở dữ liệu có tên ShowRoom với một bảng, tức là Ô tô. Bảng Ô tô có ba cột:Id, Tên và công ty. Chúng tôi sẽ sử dụng một quy trình được lưu trữ để điền vào bảng Ô tô.
Như đã mô tả trước đó, bước đầu tiên là tạo một loại bảng do người dùng xác định tương ứng với bảng mà bạn muốn điền. Thực thi tập lệnh sau để làm như vậy:
CREATE TYPE CarTableType AS TABLE ( Id int primary key, Name nvarchar(50), company nvarchar(50) ) Go
Trong tập lệnh ở trên, chúng tôi tạo biến CarTableType do người dùng xác định của loại Bảng. Đây là biến mà chúng ta sẽ chuyển cho thủ tục được lưu trữ. Có thể thấy rằng các cột của biến CarTableType tương tự như trong bảng Cars.
Bây giờ, hãy tạo một thủ tục được lưu trữ chấp nhận biến CarTableType làm tham số. Bên trong thủ tục được lưu trữ, chúng tôi sẽ CHỌN tất cả các bản ghi từ biến này và chèn chúng vào bảng Cars. Thực thi tập lệnh sau để tạo thủ tục được lưu trữ như vậy:
CREATE PROCEDURE spInsertCars @CarType CarTableType READONLY AS BEGIN INSERT INTO Cars SELECT * FROM @CarType END
Trong tập lệnh trên, chúng tôi tạo thủ tục được lưu trữ spInsertCars. Điều quan trọng cần đề cập là bạn phải chỉ định tham số do người dùng xác định là ĐÃ SN SÀNG bên trong thủ tục được lưu trữ, nếu không làm như vậy sẽ dẫn đến lỗi thời gian chạy.
Bạn có thể thấy rằng thủ tục được lưu trữ spInsertCars chấp nhận tham số CarTableType và gán nó cho biến @CarType của kiểu CarTableType.
Bước cuối cùng là tạo một biến của biến CarTableType, điền nó với dữ liệu giả và chuyển nó vào thủ tục lưu trữ spInsertCars. Hãy xem tập lệnh sau:
DECLARE @CarTableType CarTableType INSERT INTO @CarTableType VALUES (1, 'Corrolla', 'Toyota') INSERT INTO @CarTableType VALUES (2, 'Civic', 'Honda') INSERT INTO @CarTableType VALUES (3, '6', 'Audi') INSERT INTO @CarTableType VALUES (4, 'c100', 'Mercedez') INSERT INTO @CarTableType VALUES (5, 'Mustang', 'Ford') EXECUTE spInsertCars @CarTableType
Trong đoạn script trên, trước tiên chúng ta khai báo biến @CarTableType kiểu CarTableType. Sau đó, chúng tôi chèn 5 bản ghi giả vào biến này. Cuối cùng, chúng tôi thực thi thủ tục được lưu trữ spInsertCars và chuyển cho nó biến @CarTableType làm tham số.
Bên trong thủ tục được lưu trữ, năm bản ghi từ biến @CarTableType được chọn và chèn vào bảng Cars. Bây giờ nếu bạn chọn tất cả các bản ghi từ bảng Cars, bạn sẽ thấy các bản ghi mới được chèn vào. Thực thi tập lệnh sau để làm như vậy:
SELECT * FROM Cars
Đầu ra của tập lệnh ở trên trông giống như sau:
Có thể thấy từ đầu ra rằng tất cả các bản ghi từ biến @CarTableType đã được chèn vào bảng Cars.