提问人:Khaled Nasser 提问时间:2/3/2023 更新时间:2/3/2023 访问量:39
SQL Server make table 作为函数参数
SQL Server make table as a function parameter
问:
我有这个函数,我想将表“[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
答:
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 行作为 、 或 传递。DataReader
DataTable
IEnumerable<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
或者,您可能希望考虑不使用表类型参数,而是使用标量值的内联表值函数;虽然很难知道他们想要什么。
评论