sql-server - 如何将表变量从 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”。
解决方案
表变量应该是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
推荐阅读
- c# - 在 C# 应用程序中,所有线程随机暂停执行几秒钟
- react-native - 如何为 DateTimePicker 设置 null
- sql - 将字段值注入节点中的 sql 查询
- excel - 自动过滤器的范围不超过 100 行来删除过滤的数据
- windows - 是否可以按顺序使用多个代理 Windows?
- amazon-web-services - 为什么“terraform apply”试图破坏工作空间中的所有其他东西?
- jsf - 无法将 JSF 与 camunda 任务列表一起使用?
- sql - 使用 docker 和 Postgres 进行 Flutter 应用测试
- linux - Bash如何过滤输入文件
- javascript - 仅在没有用户交互或输入时刷新页面