具有参数 CTE 表达式结果的表值函数



是否可以有一个包含 tvf 的 select 语句,并且其参数是 CTE 表达式的结果?这是我的代码:

 ;with
 date_cte as
 (
    SELECT * FROM ExplodeDates('2012-10-09','2012-10-12')
 )
SELECT * FROM ufn_GET_ATTENDANCE
(
    SELECT QUOTENAME(CONVERT(varchar(10),thedate,120),'''') thedate FROM date_cte
)

当我运行此查询时,错误是关键字"SELECT"附近的语法不正确。 和")"附近的语法不正确。

可能吗?或者我对 CTE 有一些误解。谢谢!

如果你的 SQLServer 版本中有 CTE,那么也有 CROSS APPLY 和 OUTER APPLY 运算符

;with date_cte as
 (
  SELECT * FROM ExplodeDates('2012-10-09','2012-10-12')
 )
  SELECT c.*
  FROM date_cte CROSS APPLY ufn_GET_ATTENDANCE(QUOTENAME(CONVERT(varchar(10), thedate, 120), '''')) c

关于SQLFiddle的演示

如果ufn_GET_ATTENDANCE要采用标量输入,则可以将内部查询括起来以向其提供标量值。

;with
 date_cte as
 (
    SELECT * FROM ExplodeDates('2012-10-09','2012-10-12')
 )
SELECT * FROM ufn_GET_ATTENDANCE
(
    (SELECT QUOTENAME(CONVERT(varchar(10),thedate,120),'''') thedate FROM date_cte)
)

但是,由于ufn_GET_ATTENDANCE将用户定义的表类型作为参数,因此无法传递 CTE 结果。 甚至不是兼容的表变量,除非它是 EXACT 定义的类型。

请参阅以下示例:

create type ud_type as table (A int)
GO
create function table_in(@in ud_type readonly)
returns table as
return select * from @in
GO
declare @tbl ud_type;
select * from table_in(@tbl)
-- ok
GO
declare @tbl table (A int);
select * from table_in(@tbl)
-- Operand type clash: table is incompatible with ud_type:

最新更新