2016-01-23 34 views
0

我的要求是根據傳遞id從存儲過程返回用戶定義的表。如何從存儲過程返回用戶定義的表類型

首先我創造我的表類型:

CREATE TYPE test AS TABLE 
(
    id int not null, 
    name nvarchar(50) not null, 
    value nvarchar(50) not null 
) 

現在我定義我的存儲過程爲:

CREATE PROCEDURE [dbo].sp_test 
    @id int, 
    @racun_stavke dbo.test READONLY -- I need this as OUTPUT ? 
AS 
BEGIN 
    SET NOCOUNT ON; 

    /*FILL MY OUTPUT Type Table AS I LIKE and return*/ 
     //enter code here 

END 
+0

旁註:你應該** **不使用'sp_'前綴爲您的存儲過程。微軟已經保留了這個前綴以供自己使用(參見*命名存儲過程*)](http://msdn.microsoft.com/en-us/library/ms190669%28v=sql.105%29.aspx),以及你將來有可能冒着名字衝突的風險。 [這對你的存儲過程性能也是不利的](http://www.sqlperformance.com/2012/10/t-sql-queries/sp_prefix)。最好只是簡單地避免使用'sp_'並將其他內容用作前綴 - 或者根本沒有前綴! –

回答

1

你可以做一個用戶定義的函數,而不是存儲過程。這是非常簡單的,在https://technet.microsoft.com/en-us/library/aa214485(v=sql.80).aspx

實例很好解釋:

CREATE FUNCTION LargeOrderShippers (@FreightParm money) 
RETURNS @OrderShipperTab TABLE 
    (
    ShipperID  int, 
    ShipperName nvarchar(80), 
    OrderID  int, 
    ShippedDate datetime, 
    Freight  money 
    ) 
AS 
BEGIN 
    INSERT @OrderShipperTab 
     SELECT S.ShipperID, S.CompanyName, 
      O.OrderID, O.ShippedDate, O.Freight 
     FROM Shippers AS S INNER JOIN Orders AS O 
       ON S.ShipperID = O.ShipVia 
     WHERE O.Freight > @FreightParm 
    RETURN 
END 
+0

你說得對,TVF在這裏是一個很好的答案(從我身邊+1)。 **但是**:如果可能的話,多語句TVF是應該避免的。他們以**非常糟糕的表現而聞名。有時候沒有辦法,但在大多數情況下(CTE非常適合這種情況!)將內部'SELECT'創建爲一行代碼是可行的。可以使用的(ad-hoc)TVF非常棒!**和比通常使用SP來讀取數據的方式更好。另一種方式是一個簡單的視圖... – Shnugo

+0

謝謝你指出性能問題,我沒有意識到這一點! – Maritim

相關問題