我正在尝试创建一个存储过程,它将临时表返回到另一个存储过程。但是,我似乎无法将表设置为输出变量。例如:
@t table(ID int) output
作为参数不起作用。但是,以下内容不会抱怨:
@t int output
有没有办法让一个存储过程获得另一个存储过程生成的表?提前谢谢!
我正在尝试创建一个存储过程,它将临时表返回到另一个存储过程。但是,我似乎无法将表设置为输出变量。例如:
@t table(ID int) output
作为参数不起作用。但是,以下内容不会抱怨:
@t int output
有没有办法让一个存储过程获得另一个存储过程生成的表?提前谢谢!
答案是不。
您可以将创建的表的名称从一个Stored Procedure
传递到另一个,然后在第二个中SP
您可以使用该名称通过表进行查询。
是的,您可以通过使用用户定义的表类型来实现这一点。你需要做的就是
这是一个示例代码。
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 变量来调用第一个过程。