2012-10-09 46 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