2011-04-09 43 views
29

Đây là câu hỏi rất đơn giản.Làm thế nào để trả lại một bảng từ một thủ tục lưu trữ?

Tôi cố gắng để trả về một bảng từ một thủ tục lưu trữ, như

select * from emp where [email protected] 

Tôi muốn trả về kết quả truy vấn này như một bảng. Tôi phải làm điều này thông qua một thủ tục được lưu trữ.

+0

Tại sao bạn cần kết quả như một bảng? Lý do của bạn sẽ thay đổi câu trả lời tôi nghĩ. – Brian

+0

bạn có muốn trả lại một thủ tục khác không !!! –

+0

@Anand Thangappan: Tôi đang gọi SP này từ ứng dụng ASP.NET của tôi. – jams

Trả lời

49

Vấn đề của bạn ở đâu ??

Đối với các thủ tục lưu trữ, chỉ cần tạo:

CREATE PROCEDURE dbo.ReadEmployees @EmpID INT 
AS 
    SELECT * -- I would *strongly* recommend specifying the columns EXPLICITLY 
    FROM dbo.Emp 
    WHERE ID = @EmpID 

Đó là tất cả những gì.

Từ ứng dụng ASP.NET của bạn, chỉ cần tạo một SqlConnectionSqlCommand (đừng quên để thiết lập CommandType = CommandType.StoredProcedure)

DataTable tblEmployees = new DataTable(); 

using(SqlConnection _con = new SqlConnection("your-connection-string-here")) 
using(SqlCommand _cmd = new SqlCommand("ReadEmployees", _con)) 
{ 
    _cmd.CommandType = CommandType.StoredProcedure; 

    _cmd.Parameters.Add(new SqlParameter("@EmpID", SqlDbType.Int)); 
    _cmd.Parameters["@EmpID"].Value = 42; 

    SqlDataAdapter _dap = new SqlDataAdapter(_cmd); 

    _dap.Fill(tblEmployees); 
} 

YourGridView.DataSource = tblEmployees; 
YourGridView.DataBind(); 

và sau đó điền ví dụ a DataTable với dữ liệu đó và liên kết nó với ví dụ: một GridView.

+0

Xin chào, nếu tôi cần bảng đó trong thông số đầu ra được khai báo. nó có thể được thực hiện? đó là kiểu dữ liệu của đầu ra đó? –

+0

@GuillermoVarini: không, bạn không thể gửi lại toàn bộ bảng dưới dạng thông số đầu ra, hiện tại không được hỗ trợ –

4

Trong SQL Server 2008 bạn có thể sử dụng

http://www.sommarskog.se/share_data.html#tableparam

hoặc khác đơn giản và tương tự như thực hiện chung

CREATE PROCEDURE OrderSummary @MaxQuantity INT OUTPUT AS 

SELECT Ord.EmployeeID, SummSales = SUM(OrDet.UnitPrice * OrDet.Quantity) 
FROM Orders AS Ord 
    JOIN [Order Details] AS OrDet ON (Ord.OrderID = OrDet.OrderID) 
GROUP BY Ord.EmployeeID 
ORDER BY Ord.EmployeeID 

SELECT @MaxQuantity = MAX(Quantity) FROM [Order Details] 

RETURN (SELECT SUM(Quantity) FROM [Order Details]) 
GO 

Tôi hy vọng sự giúp đỡ của mình cho bạn

4

RẤT quan trọng bao gồm

SET NOCOUNT ON; 

vào SP, Trong dòng đầu tiên, nếu bạn làm INSERT trong SP, thì END SELECT không thể trả về giá trị.

THEN, in vb60 you can 
SET RS = CN.EXECUTE(SQL) 

HOẶC

RS.OPEN CN,RS, SQL 
+0

Điều này làm việc cho một tình huống phức tạp hơn một chút, cảm ơn! – Chisko

Các vấn đề liên quan