SQL Server make table 作为函数参数

SQL Server make table as a function parameter

提问人:Khaled Nasser 提问时间:2/3/2023 更新时间:2/3/2023 访问量:39

问:

我有这个函数,我想将表“[SEJ_Reservation]”作为函数的参数,以便能够将该函数与另一个表一起使用,该函数如下:

CREATE FUNCTION [dbo].[fn_Inhouse]()
RETURNS @TEM_INHOUSE TABLE (LogID int ,InHouseDate DATE)
AS
BEGIN
with 
 l0 as (select 0 v from (values(0),(0),(0),(0),(0),(0),(0),(0),(0),(0))v(v)), 
 l1 as (select 0 v from l0 a cross join l0 b),
 nums as (select n = Row_Number() over(order by @@Spid) from l1)

insert into @TEM_INHOUSE (LogID, InHouseDate)
select ro.LogID, DateAdd(day, -n, ro.C_OUT) as InHouseDate 
from [dbo].[SEJ_Reservation] ro
join nums n on n.n <= ro.Gun;
  RETURN;
END;

我尝试这样的事情:

CREATE TYPE TableType 
AS TABLE (LogID int,C_OUT datetime,Gun int)
GO 

CREATE FUNCTION [dbo].[fn_Inhouse5](@mytable TableType  READONLY)
RETURNS @TEM_INHOUSE TABLE (LogID int ,InHouseDate DATE)
AS
BEGIN
with 
 l0 as (select 0 v from (values(0),(0),(0),(0),(0),(0),(0),(0),(0),(0))v(v)), 
 l1 as (select 0 v from l0 a cross join l0 b),
 nums as (select n = Row_Number() over(order by @@Spid) from l1)

insert into @TEM_INHOUSE (LogID, InHouseDate)
select ro.LogID, DateAdd(day, -n, ro.C_OUT) as InHouseDate 
from @mytable ro
join nums n on n.n <= ro.Gun;
RETURN
END;
GO

SELECT * from  dbo.[fn_Inhouse5]('[SEJ_Reservation]')

但收到消息错误:

 Operand type clash: varchar is incompatible with TableType
sql sql server 函数 function-parameter

评论


答:

1赞 Dan Guzman 2/3/2023 #1

您需要声明表类型,插入行,并将其作为函数的表值参数传递。T-SQL 示例:

DECLARE @TableType TableType;

INSERT INTO @TableType (LogID, C_OUT, Gun)
SELECT LogID, C_OUT, Gun
FROM SEJ_Reservation;

SELECT * from  dbo.[fn_Inhouse5](@TableType);

在 .NET 应用程序代码中,可以将 TVP 行作为 、 或 传递。DataReaderDataTableIEnumerable<SqlDataRecord>

评论

0赞 Khaled Nasser 2/3/2023
是的,效果很好,谢谢,我以前试过,但是我如何使用 View 中的功能?
0赞 Thom A 2/3/2023
你将无法,@KhaledNasser.
0赞 Dan Guzman 2/3/2023
@KhaledNasser,由于视图无法参数化,因此需要将视图查询合并到 TVF 中,而不是相反。
0赞 Thom A 2/3/2023
或者,您可能希望考虑不使用表类型参数,而是使用标量值的内联表值函数;虽然很难知道他们想要什么。