写一个SQL的 Function 想在Store Procedures返回一个特地的字符串   大家帮我看看哪里有问题  谢谢  
aDeliverySchedule 是一个表
  对于每输入的一个  @StatusType  和iOrderPlanID  会有多条记录   想根据表中的iTotalCnt 和 iDeliveredCnt的关系  返回一个特地的字符串     只要返回的所有记录中有一个的  @vchStatus是 In Processing  就 返回  'In Processing'  
如果所有的纪录都是Delivered  那么就返回'Delivered'
如果所有的纪录都是Scheduled  那么就返回'Scheduled'这些状态都定义在code里面     小弟总是返回0   请大家帮我看一下  谢谢
set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
go
-- =============================================
-- Description: get Status for Order Plan
-- =============================================
ALTER FUNCTION [dbo].[FN_OrderPlanStatus]
(
    @StatusType varchar(100),
    @iOrderPlanID int
)
RETURNS varchar(200)
AS
BEGINdeclare @rst varchar(200),@iTotalCnt int,@iDeliveredCnt int,int,@iDeliveryScheduleID int,@vchStatus varchar(50)
    
 if @StatusType='Delivery'
begin
Declare aPlanStatusCursor CURSOR FOR
        Select a.iScheduleID,a.iTotalCnt,a.iDeliveredCnt
from aDeliverySchedule a 
where a.iOrderPlanID = @iOrderPlanID
    
DECLARE @aPlanStatusTable TABLE
(    iDeliveryScheduleID int,
    iTotalCnt int,
    iDeliveredCnt int,
    iOrderPlanID int,
    vchStatus varchar(50)
)OPEN aPlanStatusCursor
FETCH NEXT FROM aPlanStatusCursor INTO @iDeliveryScheduleID,@iTotalCnt,@iDeliveredCnt
    WHILE (@@FETCH_STATUS=0)
BEGIN
       if(@iTotalCnt-@iDeliveredCnt=0)
          set @rst='Delivered'
        else if(@iDeliveredCnt-@iTotalCnt<0 and @iDeliveredCnt<>0)
          set @rst='In Processing'
        else if(@iTotalCnt*@iDeliveredCnt=0)
          set @rst='Scheduled'
        else 
          set @rst='Unknown'  if  @rst='In Processing'
       return @rst      set @vchStatus=@rst
INSERT INTO @aPlanStatusTable VALUES(@iDeliveryScheduleID,@iTotalCnt ,@iDeliveredCnt,@iOrderPlanID,@vchStatus)
   
FETCH NEXT FROM aPlanStatusCursor INTO @iDeliveryScheduleID,@iTotalCnt ,@iDeliveredCnt
END
CLOSE aPlanStatusCursor
DEALLOCATE aPlanStatusCursorSelect Distinct @rst=vchStatus from @aPlanStatusTablereturn @rst
end
     return @rst
END

解决方案 »

  1.   

    我在Store Procedures 里面测试了 附值是可以的  但是我对写到Function 里面不太清楚 return 的地方怎么写呢
      

  2.   

    -- =============================================
    -- Description: get Status for Order Plan
    -- =============================================
    ALTER FUNCTION [dbo].[FN_OrderPlanStatus]
    (
    @StatusType varchar(100),
    @iOrderPlanID int
    )
    RETURNS varchar(200)
    AS
    BEGINdeclare @rst varchar(200)if @StatusType='Delivery'
    begin
    select @rst=isnull(@rst+',','')+a from
    (
    select
    case
    when iTotalCnt=iDeliveredCnt then 'Delivered'
    when iDeliveredCnt<iTotalCnt and iDeliveredCnt<>0 then 'In Processing'
    when iTotalCnt*iDeliveredCnt=0 then 'Scheduled'
    else 'Unknown'
    end as a
    from aDeliverySchedule where iOrderPlanID=@iOrderPlanID
    ) as t
    group by a
    endreturn(@rst)END
      

  3.   

    --> 如果不可能出现多种情况:-- =============================================
    -- Description: get Status for Order Plan
    -- =============================================
    ALTER FUNCTION [dbo].[FN_OrderPlanStatus]
    (
    @StatusType varchar(100),
    @iOrderPlanID int
    )
    RETURNS varchar(200)
    AS
    BEGINdeclare @rst varchar(200)if @StatusType='Delivery'
    begin
    if exists (select 1 from aDeliverySchedule where iOrderPlanID=@iOrderPlanID and iTotalCnt=iDeliveredCnt)
    set @rst='Delivered'
    else if exists (select 1 from aDeliverySchedule where iOrderPlanID=@iOrderPlanID and iDeliveredCnt<iTotalCnt and iDeliveredCnt<>0)
    set @rst='In Processing'
    else if exists (select 1 from aDeliverySchedule where iOrderPlanID=@iOrderPlanID and iTotalCnt*iDeliveredCnt=0)
    set @rst='Scheduled'
    else
    set @rst='Unknown'
    endreturn(@rst)END
      

  4.   

    学习了,谢谢楼上,基本上不会出现一种情况的,上面那段code 好像总是返回  Delivered,In Processing,Scheduled 不知道是不是我哪里有问题  
      

  5.   

    重看了一下楼主的代码,如果出现四种情况:
    Delivered
    In Processing
    Scheduled
    Unknown
    -----------
    希望返回:In Processing
    但如果是这几种情况呢:
    Delivered
    Scheduled
    Unknown
    -----------
    你希望返回什么?
      

  6.   

    是这样  情况只可能是     要么全部都是 Delivered  那么就返回   delivered    要么全部都是Scheduled的  那么返回Scheduled     只要有一条是In Processing  那么就马上返回In Processing   UnKnown  其实  just in case  基本不可能出现     
      

  7.   

    可能我没有叙述清楚   6楼的是指要有一种就马上返回该种情况    这个可以适用In Processing  但是如果是Delivered和Scheduled必须得遍历所有结果才能返回相应的值   比如有10条记录   必须全部都是Delivered才能返回Delivered  ,   Scheduled也是        只要这10条记录中有一条是In Processing那么就返回了In Processing了       
      

  8.   

    那如果1 条 Delivered
    5 条 Scheduled
    该返回什么?
      

  9.   

    不好意忘记 一条      还有一种 情况是   返回的10条记录里面只有Delivered和Scheduled两种  这样的话也是In Processing   总之还是  只有10条都是Delivered才能是Delivered,10条都是Scheduled才能是Scheduled 其他都是In Processing      实际上是这个Query是返回的某个大分类下的小分类1个大分类下可能有多个小分类的纪录   那么只有所有的小分类完成了  才能标注大分类完成了 否则就是处理中   就是这个目的   谢谢了     学习了很多有用的东西
      

  10.   

    --> 那应该这样:-- =============================================
    -- Description: get Status for Order Plan
    -- =============================================
    ALTER FUNCTION [dbo].[FN_OrderPlanStatus]
    (
    @StatusType varchar(100),
    @iOrderPlanID int
    )
    RETURNS varchar(200)
    AS
    BEGINdeclare @rst varchar(200)declare @temp table (iTotalCnt int, iDeliveredCnt int, vchStatus varchar(50))if @StatusType='Delivery'
    begin
    insert @temp select iTotalCnt,iDeliveredCnt,null from aDeliverySchedule where iOrderPlanID=@iOrderPlanID
    if exists (select 1 from @temp where iDeliveredCnt<iTotalCnt and iDeliveredCnt<>0)
    begin
    set @rst='In Processing'
    return(@rst)
    end
    update @temp set vchStatus=case when iTotalCnt=iDeliveredCnt then 'Delivered' when iTotalCnt*iDeliveredCnt=0 then 'Scheduled' else 'Unknown' end
    if exists (select 1 from @temp where vchStatus='Unknown')
    set @rst='Unknown'
    else if not exists (select 1 from @temp where vchStatus<>'Delivered')
    set @rst='Delivered'
    else if not exists (select 1 from @temp where vchStatus<>'Scheduled')
    set @rst='Scheduled'
    else
    set @rst='In Processing'
    endreturn(@rst)END
      

  11.   

    谢谢楼上的大哥/大姐    小弟学习了  对SQL Function这里不熟悉 总是想拿C#和Store Procedures那套东西往里面套不得要领     请问有什么可以系统的学习一下这方面的知识的书或者参加什么考试之类的吗    非常感谢这么晚耽误了您休息时间
      

  12.   

    这没什么,SQL语法很少,写多了就熟练了,比C#简单很多。可以看看联机帮助中的T-SQL部分。
      

  13.   

    联机帮助中的T-SQL+查询编辑器+多写sql代码+多上csdn = 邹老大
    纯粹瞎扯,哈哈