2009-09-02 27 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