【问题标题】:How to return user defined table types from stored procedure [duplicate]如何从存储过程返回用户定义的表类型[重复]
【发布时间】:2016-01-23 09:30:35
【问题描述】:

我的要求是根据传递的 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

【问题讨论】:

标签: sql sql-server stored-procedures sql-function


【解决方案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

【讨论】:

  • 你说得对,TVF 是一个很好的答案(我这边 +1)。 但是:如果可能的话,多语句 TVF 是应该避免的。它们以非常糟糕的性能而闻名。有时没有办法,但在大多数情况下(CTE 非常适合这个!)可以将内部 SELECT 创建为单行。可内联(ad-hoc)TVF 真的很棒!并且比使用 SP 读取数据的通常方式要好得多。另一种方法是简单的 VIEW...
  • 感谢您指出性能问题,我不知道!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多