是否可以有一个包含 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: