将select中的标量UDF转换为表值函数

时间:2012-08-24 18:31:05

标签: sql-server sql-server-2008 query-optimization user-defined-functions

我有2张桌子。表1(DateTable)包含日期和项目名称,表2(PriceTable)包含价格随时间变化的价格和价格变化的日期。

表1(DateTable)

| itemName |   Date   |
|    A     | 2012-8-22|
|    A     | 2012-9-2 |

表2(PriceTable)

| Update Date | Price|itemName|
|  2012-7-1   | 5.00 |   A    |
|  2012-8-1   | 5.50 |   A    |
|  2012-9-1   | 6.00 |   A    |

我的任务是,在给定日期的情况下,我想确定该日期的物品价格。

我目前正在使用标量函数执行此操作,这非常慢。有没有办法我可以重写这个,作为一个表值函数或使用其他一些有助于加快这一点的东西?我现在已经盯着这一段暂时无济于事了。

我目前的疑问:

select
    d.date
    ,dbo.fn_GetPrice(d.date, 'A')
from DateTable d
where d.itemName = 'A'

和功能

alter function fn_GetPrice(@date DateTime, @itemName varchar(50))
returns int
as
begin
declare @price int
    select @price = p.price
    from PriceTable p
    where p.itemName = @itemName
        and p.updateDate = (select MAX(p2.updateDate)
            from PriceTable p2
            where p2.updateDate < @date
                and p2.itemName = @itemName)
return @price
end

1 个答案:

答案 0 :(得分:1)

这会有用吗?仅使用udf替换join

select
    d.date,
    p.Price
from 
    DateTable d 
    join PriceTable p
        on p.itemName = d.itemName
        and p.updateDate = (
            select max(p2.updateDate)
            from PriceTable p2
            where 
                p2.updateDate < d.date
                and p2.itemName = p.itemName
        )
where d.itemName = 'A'