Как передать табличную переменную из FunctionA в FunctionB и вернуть табличную переменную из FunctionB в FunctionA? - PullRequest
1 голос
/ 28 марта 2019

В качестве заголовка я написал следующий простой код:

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

Когда я ожидаю, что функция B получит сообщение об ошибке:

Синтаксис рядом с ключевым словом "таблица" неверен.

Должна быть объявлена ​​переменная таблицы данных "@tempTableB".

Должна быть объявлена ​​переменная таблицы данных "@tempTableA".

1 Ответ

1 голос
/ 28 марта 2019

Переменная таблицы должна быть 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
...