2012-10-09 45 views
2

是否可以使用包含tvf的select语句,并且其参数是CTE表达式的结果?这里是我的代码:具有参数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

如果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: 
+0

附近有语法错误('和' )' –

+1

注意:如果不清楚,你不能传递一个CTE,因为它只是一个没有隐式“类型”的编译结果集,并且不会匹配你ser定义的表类型。它必须是一个专门用作用户定义类型的变量。 – RichardTheKiwi

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