表值函数与参数CTE表达式结果

时间:2012-10-09 10:15:55

标签: sql common-table-expression

是否可以使用包含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有一些误解。谢谢!

2 个答案:

答案 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上的演示