3

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

4

2 回答 2

1

如果您的 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上的演示

于 2012-11-27T15:28:01.843 回答
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:
于 2012-10-09T10:19:39.353 回答