2014-01-10 24 views
0

我需要标量转换成内联函数如何将标量转化为内联函数的SQL Server 2008

我的标量函数

create function [dbo].[fun_functional_score] (@phy_id varchar(20)) 
    returns varchar(50) 

    as 
    begin 

    declare @level_initial int, @level_current int 

    -- initial functional score 
    set @level_initial=(SELECT pflag.fun_level 
    FROM tbl_phy_demographic_details as [phy] 
     inner join tbl_all_purple_flag_level as [pflag] on phy.Demographic_id=pflag.Id 
    WHERE phy.Physicion_id= @phy_id 
     and pflag.visited_count in (select MAX(visited_count)-1 from tbl_all_purple_flag_level group by id)) 


    -- current functional score 
    set @level_current=(SELECT pflag.fun_level 
    FROM tbl_phy_demographic_details as [phy] 
     inner join tbl_all_purple_flag_level as [pflag] on phy.Demographic_id=pflag.Id 
    WHERE [email protected]_id 
     and pflag.visited_count in (select MAX(visited_count) from tbl_all_purple_flag_level group by id)) 


-- current functional scor 

--set @level_current=(SELECT pflag.fun_level 

-- FROM tbl_phy_demographic_details as [phy] 



    --to calculate functional score 
    declare @fun_level varchar(20),@result varchar(50) 

    set @[email protected][email protected]_initial; 

    if @fun_level = 0 set @result='Maintained' 
    if @fun_level = '-1' set @result='Minor Improvement' 
    if @fun_level = '-2' set @result='Moderate Improvement' 
    if @fun_level = '-3' set @result='Significant Improvement' 
    if @fun_level = '-4' set @result='Substantial Improvement' 
    if @fun_level = '1' set @result='Minor Reduction' 
    if @fun_level = '2' set @result='Moderate Reduction' 
    if @fun_level = '3' set @result='Significant Reduction' 
    if @fun_level = '4' set @result='Substantial Reduction' 




    return @result 

    end 

这是可能的吗?

+0

请不要用[tag:mysql]标记SQL Server问题。 “MySQL”并不意味着“我当前的SQL Server问题”... –

+0

你是否试图问你同一个问题,你有早些发布http://stackoverflow.com/questions/21046294/how-to-return-multilpe- values-from-function-sql-server? – Sachin

+0

是的,有一些错误,这是更新的代码。现在我需要转换成内联函数? – Happy

回答

0

如果函数具有return语句,则不认为它是“内联”的。我不100%知道你要什么,但是你可以重写你试图重写这样并将它被认为是内联:

SELECT CASE @[email protected]_initial 
    WHEN '0' THEN 'Maintained' 
    WHEN '-1' THEN 'Minor Improvement' 
    WHEN '-2' THEN 'Moderate Improvement' 
    .... 
    ELSE 'some default value' END AS ReturnValue 

从本质上讲,为了使函数内联,它必须是一个单一的SQL语句。

编辑

我不相信你可以创建一个内联标量函数(有人请纠正我,如果我错了)。内联函数必须是表值函数(尽管该表可以由单列和单列组成)。

+0

好的,谢谢我将改变concept3。 – Happy

+0

我做了几个编辑(包括别名从SELECT语句列)。 –

0
create function [dbo].[fun_functional_score] (@phy_id varchar(20)) 
returns table 
as 
return (
    WITH 
    t1(fun_level) AS (
    SELECT 
    ( 
     SELECT pflag.fun_level -- current functional score 
     FROM tbl_phy_demographic_details as [phy] 
      inner join tbl_all_purple_flag_level as [pflag] on phy.Demographic_id=pflag.Id 
     WHERE phy.Physicion_id= @phy_id 
      and pflag.visited_count in (select MAX(visited_count) from tbl_all_purple_flag_level group by id) 
    ) - 
    (  
     SELECT pflag.fun_level -- initial functional score 
     FROM tbl_phy_demographic_details as [phy] 
      inner join tbl_all_purple_flag_level as [pflag] on phy.Demographic_id=pflag.Id 
     WHERE [email protected]_id 
      and pflag.visited_count in (select MAX(visited_count)-1 from tbl_all_purple_flag_level group by id) 
    ) 
), 
    t2(fun_level, result) AS (
    SELECT '0', 'Maintianed'    UNION ALL 
    SELECT '-1', 'Minor Improvement'  UNION ALL 
    SELECT '-2', 'Moderate Improvement' UNION ALL 
    SELECT '-3', 'Significant Improvement' UNION ALL 
    SELECT '-4', 'Substantial Improvement' UNION ALL 
    SELECT '1', 'Minor Reduction'   UNION ALL 
    SELECT '2', 'Moderate Reduction'  UNION ALL 
    SELECT '3', 'Significant Reduction' UNION ALL 
    SELECT '4', 'Substantial Reduction' 
) 
    SELECT result FROM t2 INNER JOIN t1 ON t1.fun_level = t2.fun_level 
) 

理想的情况下,t2应该在数据库中的表然后埋在一个功能不硬编码值。

+0

错误“当子查询遵循=,!=,<, <= , >,> =或子查询用作表达式时,这是不允许的。”该怎么做帮助我... – Happy

相关问题