Lưu Quang Triệu

Không ngừng sáng tạo thì sẽ không sợ bị diệt vong

Lấy Về Giá Trị Từ Thủ Tục Bằng Output Parameter

Posted by millionking on January 10, 2012

Một tình huống tương đối thường gặp là bạn cần viết một thủ tục để ghi vào một bản ghi mới (ví dụ khách hàng), và trả về ID của bản ghi vừa được tạo (ID của khách hàng mới đó). SQL Server cung cấp một loại tham số gọi là output parameter dùng với thủ tục, để dùng trong tình huống trên. Để có thể dùng được output parameter cần liên quan đến cả hai phía: viết thủ tục và thực thi thủ tục.
Khi viết thủ tục, ở đoạn khai báo các tham số bạn cần đưa từ khóa “OUTPUT” vào sau tham số đó. Ở ví dụ sau, tham số @ID được khai báo là output parameter:

CREATE PROC dbo.ThemKhachHang
@Ten NVARCHAR(100),
@ID INT OUTPUT
AS
...

Đồng thời khi thực thi thủ tục bạn cũng cần đưa từ khóa “OUTPUT” vào tham số tương ứng trong lời gọi thủ tục:

DECLARE @ID INT
EXEC dbo.ThemKhachHang @Ten='Nguyen Van A', @ID OUTPUT
...

Dưới đây là ví dụ hoàn chỉnh:

CREATE TABLE dbo.KhachHang (KH_ID INT PRIMARY KEY IDENTITY, KH_Ten NVARCHAR(100))
GO
CREATE PROC dbo.ThemKhachHang
@Ten NVARCHAR(100),
@ID INT OUTPUT
AS
BEGIN
	INSERT dbo.KhachHang(KH_Ten) VALUES(@Ten)
	SET @ID = SCOPE_IDENTITY()
END

-- Gọi thủ tục
DECLARE @KH_ID INT
EXEC dbo.ThemKhachHang 'Nguyen Van A', @KH_ID OUTPUT
PRINT 'Khach hang ID:'
PRINT @KH_ID

Trong ví dụ trên tôi gọi thủ tục từ bên trong SQL Server. Khi gọi thủ tục từ ứng dụng (ví dụ .Net) công việc cũng tương tự như vậy: Bạn cũng cần khai báo một biến và truyền cho thủ tục với lựa chọn là output parameter; Khi thực hiện xong, biến đó sẽ chứa giá trị mà thủ tục gửi trả lại.

Bàn thêm về các cách làm khác
Nói chung khi muốn thủ tục gửi về một hoặc vài giá trị, cách làm dùng output parameter là thích hợp nhất. Một vài cách làm khác là dùng lệnh RETURN hoặc SELECT ở cuối thủ tục.
Bạn có thể đưa lệnh RETURN @ID vào cuối thủ tục trên và ứng dụng cũng sẽ nhận được giá trị @ID. Nhưng cách này chỉ có thể trả về một giá trị. Khi bạn cần lấy về hai giá trị hoặc nhiều hơn nữa thì nó không đáp ứng được. Ngoài ra có một lý do khác không nên dùng RETURN (và đây là lý do chính), là lệnh RETURN được tạo ra với mục đích trả về trạng thái kết quả (status) của thủ tục, ví dụ 0 là bình thường, nhỏ hơn 0 là lỗi… Trong một tình huống nào đó giá trị cần trả về là số âm, có thể ứng dụng sẽ nghĩ thủ tục đã có lỗi, mặc dù nó thực hiện thành công. Vì thế bạn không nên lạm dụng (overload) lệnh RETURN cho các mục đích khác. Microsoft cũng khuyến cáo không nên dùng RETURN để trả về dữ liệu.

Bạn cũng có thể đưa lệnh SELECT @ID vào cuối thủ tục, nó sẽ gửi về một tập kết quả chứa một bản ghi. Ở phía ứng dụng bạn cũng cần viết thêm code để đọc dữ liệu từ tập bản ghi này. Cách làm này tốn kém hơn vì tập bản ghi có overhead lớn hơn là một (hoặc vài) giá trị đơn lẻ, phía ứng dụng cũng cần nhiều code xử lý hơn. Nói chung khi chỉ cần lấy về một vài giá trị, bạn nên dùng output parameter. Còn khi có quá nhiều giá trị cần trả về, output parameter trở nên rườm rà quá thì bạn có thể chuyển sang dùng SELECT.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

 
%d bloggers like this: