2009-09-02 49 views
0

注:這個問題似乎僅限於SQL Server 2005 SP2如何在公用表表達式中引用表值函數?

我有一個迭代公用表表達式在一系列的日期。我需要在調用表值函數時引用每個日期。類似下面這樣,它給GetMyData調用的第二個參數提供了一個語法錯誤。如果我使用其他值,例如@END_DATE,則可以使用。這是錯誤:

Msg 102, Level 15, State 1, Line 17 
Incorrect syntax near '.'. 

是否有另一種方法來做到這一點,而不是使用遊標?

if object_id (N'dbo.GetMyData', N'TF') is not null 
    drop function dbo.GetMyData 
go 

create function GetMyData(@d datetime) 
returns @t table (part varchar) 
as 
begin 
    insert @t select 'a' 
    insert @t select 'b' 
    insert @t select 'c' 

    return 
end 
go 

declare @START_DATE datetime 
declare @END_DATE datetime 

set @START_DATE = '4/1/2007' 
set @END_DATE = '4/11/2007' 

with dates_in_range([date]) as 
(
    select [date] = @START_DATE 
    union all select [date] = [date] + 1 
    from dates_in_range 
    where [date] < dateadd(dd,0, datediff(dd,0,@END_DATE)) 
) 
select d.[date], c.* 
from dates_in_range d 
cross apply dbo.GetMyData(d.[date]) c 
+0

你有你'。在標記問題時,不要忘記檢查標記名稱旁邊的數字。低數字==不好的標籤。 – 2009-09-02 16:23:01

+1

我無法根據發佈的代碼複製問題。我根據你對rexem的評論定義了一個dbo.DateOnly,並用一個簡單的「split」表值函數代替了GetMyData。一切似乎都好。我注意到你的錯誤在第27行,但你沒有發佈27行代碼。這裏還有別的東西嗎? – 2009-09-02 16:36:43

+0

感謝您運行它。增加了一個更完整的例子。請注意,在交叉應用之後,使用dbo.GetMyData(@START_DATE)可以正常工作,所以我認爲除了使用引用列無效之外,其他語法都可以。 – paulwhit 2009-09-02 16:52:30

回答

1

是在這種特定情況下的database compatibility set to 90爲DB?

的 「... CROSS APPLY dbo.GetMyData(柱)...」 只會工作時兼容性> = 90。當< 90.

然而,」 ...... CROSS APPLY失敗dbo.GetMyData(@Variable)...「被接受。在錯誤的標籤 -

有一次,我以前見過這個,不知道爲什麼它不相符......

+0

就是這樣。謝謝!現在我需要弄清楚我們是否可以改變它......一堆舊的LOB應用程序在該數據庫上。 – paulwhit 2009-09-02 17:57:42