2011-04-09 125 views
29

這是非常簡單的問題。如何從存儲過程返回表?

我試圖從一個存儲過程返回一個表,像

select * from emp where [email protected] 

我想回到這個查詢結果表。我必須通過存儲過程來做到這一點。

+0

爲什麼你需要的結果的表?你的推理會改變我的想法。 – Brian 2011-04-09 12:06:34

+0

你想要回到另一個程序! – 2011-04-09 12:16:37

+0

@Anand Thangappan:我從ASP.NET應用程序中調用此SP。 – jams 2011-04-09 12:18:30

回答

49

你的問題在哪裏?

存儲過程,只需創建:

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

這是所有有。

從ASP.NET應用程序,只需創建一個SqlConnectionSqlCommand(不要忘記設置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(); 

然後填寫例如一個DataTable與該數據並將其綁定到例如一個GridView。

+0

嗨,如果我需要該表是在聲明的輸出參數,那麼呢?可以做到嗎?這是輸出的數據類型? – 2016-11-10 17:23:54

+0

@GuillermoVarini:不,你不能發回整個表作爲輸出參數,目前不支持 – 2016-11-10 19:05:30

4

在SQL Server 2008中您可以使用

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

否則簡單,同普通的執行

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 

我希望它幫助你

4

非常重要的包括

SET NOCOUNT ON; 

進入SP,在第一行中, 如果您在SP中執行INSERT,則END SELECT不能返回值。

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

OR

RS.OPEN CN,RS, SQL 
+0

這適用於更復雜的情況,謝謝! – Chisko 2016-08-27 21:17:22