是否可以使用包含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有一些误解。谢谢!
答案 0 :(得分:0)
如果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:
答案 1 :(得分:0)
如果您的SQLServer版本中有CTE,那么也有CROSS APPLY and 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上的演示