首页 > 解决方案 > 如何将表变量从 FunctionA 传递到 FunctionB,并将表变量从 FunctionB 返回到 FunctionA?

问题描述

作为标题,我写了一个简单的代码如下。

functionA:将结果(表变量)传递给函数B

functionB:重新分配字段名称并将结果(表变量)返回给函数A

create function functionA(
    @Type nvarchar(max) 
    , @isArray bit = 0
)
returns @tempTable table (
    FieldId nvarchar(4000)
    , FieldName nvarchar(4000)
    , FieldType nvarchar(4000)
    , IsArray bit)
as
begin
    declare @tempTableA table (
        FieldId nvarchar(4000)
        , FieldName nvarchar(4000)
        , FieldType nvarchar(4000)
        , IsArray bit) 

    insert @tempTableA 
    select 
        *
    from 
        TableA
    where 
            @isArray = 1 and @Type='TypeA'
    
    insert @tempTable 
    select * from functionB(@tempTableA)

    return 

end
go
create function functionB(
    --How to get the table variable from functionA?
    @tempTableA table
)
returns @tempTableB table (
    FieldId nvarchar(4000)
    , FieldName nvarchar(4000)
    , FieldType nvarchar(4000)
    , IsArray bit)
as
begin
    insert @tempTableB
    select 
        FieldId [Id]
            , FieldName [Name]
            , FieldType [Type]
            , IsArray Array
    from 
        @tempTableA
    
    return 

end
go

当我期望 functionB 会收到错误消息时:

关键字“table”附近的语法不正确。

必须声明数据表变量“@tempTableB”。

必须声明数据表变量“@tempTableA”。

标签: sql-serversql-function

解决方案


表变量应该是READONLY. 让我举个例子:

首先,您应该创建用户定义表类型:

CREATE TYPE [dbo].[tp_List] AS TABLE(
    [Val] [int] NULL
)
GO

然后将此表类型用于您的函数:

GO 
CREATE FUNCTION FunctionB( 
@TableName tp_List READONLY
)
RETURNS @mt table (a int)
AS
BEGIN
    INSERT INTO @mt
    SELECT * FROM @TableName
    RETURN
END
GO

和用法:

DECLARE @tbl tp_List
INSERT INTO @tbl
(
    Val
)
VALUES
(50)
SELECT * FROM FunctionB(@tbl)

输出:

a
50

推荐阅读