0

我正在尝试创建一个存储过程,它将临时表返回到另一个存储过程。但是,我似乎无法将表设置为输出变量。例如:

   @t table(ID int) output

作为参数不起作用。但是,以下内容不会抱怨:

   @t int output

有没有办法让一个存储过程获得另一个存储过程生成的表?提前谢谢!

4

2 回答 2

0

答案是不。

您可以将创建的表的名称从一个Stored Procedure传递到另一个,然后在第二个中SP您可以使用该名称通过表进行查询。

于 2012-10-01T16:04:36.653 回答
0

是的,您可以通过使用用户定义的表类型来实现这一点。你需要做的就是

  1. 创建用户定义的表类型。
  2. 创建您的第一个存储过程以接受表类型变量。
  3. 在您的第二个过程中声明一个 Table Type 变量,用您想要的数据填充它并通过传入 Table Type 变量来调用第一个过程。

这是一个示例代码。

1) 创建用户定义的表类型。在 Programmability --> Types --> User Defined Table Types --> 右击创建你的表类型

CREATE TYPE [schemaname].[Ttype] AS TABLE 
(
    EmployeeID int,
    EmployeeName varchar(100),
)
GO

上面的类型只是一个例子,把你需要的列放在里面。这里 Ttype 是 TableType 的名称(您可以根据自己的方便命名)

2) 创建您的第一个存储过程,它将接受 Table 类型作为变量,以便您可以使用它。

CREATE PROCEDURE [schemaname].[StoredProcName]
@TableType Ttype READONLY
AS
BEGIN
     -- Just an example on how to use the TableType.

    INSERT INTO TableName(EmployeeId,EmployeeName)
    SELECT EmployeeID,EmployeeName FROM @TableType

END
GO

上面的存储过程接受一个表类型变量。Ttype 表示@Tabletype 变量是用户定义的表类型。READONLY 表示不能对表类型参数执行任何 DML 操作。

3) 现在,创建第二个过程,将表类型参数传递给上面创建的过程。

CREATE PROCEDURE [schemaname].[StoredProc2Name]

AS
BEGIN

    SET NOCOUNT ON;

    DECLARE @Table as Ttype 

    INSERT INTO @Table(EmployeeID,EmployeeName)
    SELECT EmployeeID,EmployeeName FROM schemaname.Employees

    EXEC [schemaname].[StoredProcName] @Table


END
GO

在上面的 SP 中,您声明了一个名为 @Table 的变量,它属于表类型 (Ttype)。现在你用你需要的数据填充它,然后通过传入@Table 变量来调用第一个过程。

于 2012-10-01T20:05:35.930 回答