如何在CASE表达式中调用表值函数

时间:2015-04-23 10:41:45

标签: sql sql-server

我希望调用函数以防万一,但是当我调用函数时,我得到一个错误。 我的代码是:

s = case 
when v.IsAverage=1 then 
  isnull(avg([Value]),0) 
when v.IsCumulative=1 then  
  isnull(sum([Value]),0) 
when v.IsCumulative=0 then
  GetLastValueTest('93/.1/01','93/12/29')

我收到此错误:

  

'GetLastValueTest'不是公认的内置函数名称。

但是当我这样打电话时它会起作用:

select * from GetLastValueTest('93/.1/01','93/12/29')

2 个答案:

答案 0 :(得分:4)

  

从GetLastValueTest中选择*(' 93 / .1 / 01',' 93/12 / 29')

GetLastValueTest看起来像一个表值函数

然后在case语句中使用它的正确方法是:

case 
when v.IsAverage=1 then isnull(avg([Value]),0) 
when v.IsCumulative=1 then   isnull(sum([Value]),0) 
when v.IsCumulative=0 then (select top 1 [ColumnName] from GetLastValueTest('93/.1/01','93/12/29'))
end

答案 1 :(得分:2)

假设您的GetLastValueTest是标量函数 - 您需要明确指定架构,即dbo.GetLastValueTest('93/.1/01','93/12/29')(或者如果它与dbo不同,则为架构的任何内容)

如果您的GetLastValueTest是表值函数,那么您无法在case的其他分支中混合使用标量值进行选择。在这种情况下,你需要像

这样的东西
when v.IsCumulative=0 
then (select top 1 some_value from dbo.GetLastValueTest('93/.1/01','93/12/29'))