PDA

View Full Version : Hỏi một chút về Store Procedure SQL



vietnamchina.net
08-05-2005, 14:28
Mình không hiểu lắm về tác dụng của 2 dấu @, các bạn có thể giải thích giúp mình tại sao lai dùng @@identity và @@rowcount ở thủ tục dưới đây được không?

CREATE PROCEDURE InsertCategory
@CategoryName nchar(15),
@Identity int OUT
AS
INSERT INTO Categories (CategoryName) VALUES(@CategoryName)
SET @Identity = @@Identity
RETURN @@ROWCOUNT
================================================== ========
Khi mình muốn chạy thử Procedure Mình dùng SQL Querry Analyzer nhưng nó yêu cầu phải đưa vào cả tham số @Identiy mà mình chẳng biết phải đưa vào cái gì cả vì nó là tham số output mà. Rất mong được các bạn chỉ giáo

Chân thành cảm ơn các bạn

xbacala
09-05-2005, 09:04
Đ/v ngôn ngữ T/SQL của SQL Server, tất cả các biến đều phải có tên bắt đầu bằng dấu @ (trừ biến kiểu CURSOR). Do đó, "@Identity int" có nghĩa là biến có tên là @Identity với kiểu int !

Còn những biến bắt đầu bằng 2 dấu @ (như @@ROWCOUNT, @@SERVERNAME, @@FETCH_STATUS, @@IDENTITY,...) là các biến môi trường của SQL Server. Các biến này được bản thân SQL server quản lý (mình dùng không phải khai báo). Các biến môi trường này đều có 1 ý nghĩa nhất định và thừong được dùng trong những ngữ cảnh cụ thể. Ví dụ:

@@ROWCOUNT: Chứa số row bị ảnh hưởng bởi mệnh đề DML (INSERT,UPDATE,DELETE) gần nhất. Trong SP của bạn, nó sẽ cho biết có bao nhiêu row đc insert thành công

@@IDENTITY: Trả về giá trị gần mới nhất được phát sinh từ mệnh đề INSERT cho cột kiểu số tự động tăng. Trong SP của bạn, chắc chắn table có thêm 1 cột CategoryID với giá trị tự động tăng. @@IDENTITY sẽ cho bạn biết là số mới được phát sinh cho mệnh đề INSERT là bao nhiêu.

SP trên có 1 thông số kiểu OUTPUT, có nghĩa là khi chạy xong nó sẽ trả về giá trị trong biến đó cho bạn. Do đó, bạn phải khai báo 1 biến truyền vào SP để nhận kến quả nó out ra.

DECLARE @kq INT
EXEC InsertCategory 'My Category',@kp OUTPUT
PRINT 'Gia tri CategoryID moi phat sinh la:' + CAST(@kq AS VARCHAR(20))

vietnamchina.net
09-05-2005, 09:23
Rất cám ơn bạn đã nhiệt tình giúp đỡ

past_beggar
13-05-2005, 16:05
past_beggar xin bổ sung thêm tính năng của MS SQL. MS SQL cho phép tạo bảng tạm (temporary table) trong khi viết scripts: #<tablename> là bảng tạm cục bộ và ##<tablename> là bảng tạm toàn cục. Chi tiết tìm hiểu thêm trong Help nhé.

diendan86
13-05-2005, 16:38
[Revised] Tôi muốn sử dụng user-defined error message trong các trigger của Transact-SQL. Với mục đích nếu match một điều kiện nào đó, thì sẽ tham chiếu một hệ thống message do tôi định nghĩa riêng để trả về client.

Ví dụ.

USE master
EXEC sp_addmessage 50101, 16,N'Xuất quá số lượng tồn kho...'

-------
if UPDATE(ACCTFLG)
begin
select @vpdbal=tdbal,@vpdcnt=tdcnt from tbst_bal_acct where brcd=@vbrcd and itemcd=@vitemcd and itemsbtp=@vitemsbtp and valdt=(select max(valdt) from tbst_bal_man where brcd=@vbrcd and itemcd=@vitemcd and itemsbtp=@vitemsbtp and valdt<=@vvaldt)

if (@vpdbal<0) or (@vpdcnt<0)
begin
RAISERROR (50101, 16, 1) with NOWAIT
ROLLBACK TRANSACTION
end
end
-------

Xin hỏi các bạn là với các app dùng ADO hoặc ADO.NET thì bắt cái message do server trả về như trên như thế nào?

Tôi đã confuse về cách xử lý mang tính thông minh quá của Microsoft so với PL/SQL, và thật sự không hiểu là tại sao errors.count lại được reset lại tự động trong connection, nếu câu lệnh tiếp theo là đúng dù chưa kết thúc transaction, chẳng lẽ mỗi khi thực hiện một command lại kiểm tra erros sao. Mong được giải thích. Thanks!

Additional Suggestion: Lập trình Component Base Development (CBD) với kiến trúc N-Tiers bây giờ sẽ không còn chuyện dùng Trigger, Store nữa. Lớp Business (Middleware) sẽ chuyên thực hiện các nghiệp vụ nhằm loại bỏ phụ thuộc vào CSDL khi đặt hàm/thủ tục xử lý nghiệp vụ lên đó, giúp thực hiện đa hình và mềm dẻo. Mấy bác dùng T-SQL em mà yêu cầu chạy DB2 hoặc Oracle viết lại thì móm. Bác nào viết PL/SQL ngộ nhỡ khách hàng yêu cầu chạy SQL Server cũng đi, nếu khóa chết RDBMS Product của một hãng thì còn đỡ, tự nhiên làm mất tính uyển chuyển. Đó là một thiết kế lạc hậu!

ojdba
22-06-2005, 16:39
Uh. Bây giờ Client - Server ́ít sử dụng rồi. Tất nhiên PL/SQL vẫn rất quan trọng. Chịu khó nghiên cứu BEA Tuxedo với Microsoft COM+ đi thôi.

orenceJinny
23-02-2011, 17:19
http://oemsoft4you.com/brand/symantec/symantec_system_center_10_1_windows/ - Buy cheap Symantec System Center 10.1 Oem Software Version
http://oemsoft4you.com/brand/pinnacle/studio_ultimate_collection_14_0/ - Buy cheap Pinnacle Studio Ultimate Collection 14.0 Oem Software Version
http://oemsoft4you.com/brand/brainworx/brainworx_complete_bundle_vst_2_mac_osx/ - Buy cheap Brainworx Complete Bundle VST 2 Oem Software Version
http://oemsoft4you.com/brand/ahead/ahead_nero_9_0_windows/ - Buy cheap Ahead Nero 9.0 Oem Software Version
http://oemsoft4you.com/brand/adobe/creative_suite_5_master_collection_2010/ - Buy cheap Adobe Creative Suite 5 Master Collection 2010 Oem Software Version

bequay
21-04-2011, 00:02
mj you oi, mh ko hieu nh ve store procedure. Nho may Pro giup mh voi
Mh muon tao cac SP sau:
SVIEN(MASV, HOTEN, NGAYSINH, PHAI, NAM, LOP, MAKHOA)
MONHOC_HK(MAHP, MAMH, HOCKY, NAMHOC, MAGV)
KETQUA(MASV, MAHP, LANTHI, DIEMTHI)

mj you giup mh voi nha!
Thanks nhe!

[=========> Bổ sung bài viết <=========]

mj you co the giai thich cho mh dc luon chu?
Thanks!