【问题标题】:Table Valued Function with parameter CTE expression result带参数 CTE 表达式结果的表值函数
【发布时间】:2012-11-27 23:45:25
【问题描述】:

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

【问题讨论】:

    标签: sql common-table-expression


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 注意:如果不清楚,则不能通过 CTE,因为它只是一个没有隐式“类型”的组合结果集,并且与用户定义的表类型不匹配。它必须是一个明确声明为用户定义类型的变量。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多