上午我的帖子http://community.csdn.net/Expert/topic/4710/4710955.xml?temp=.5466425
我想用另一种方法做这个,可是没有人回答,我以为不可以实现呢,我结贴后gulf1234(小顾)在没有分的情况下还帮我回答了那个没有解决的问题,十分感激他,我想再开一贴来给他分,在就是想让gulf1234(小顾)和大家看看我理解gulf1234(小顾)的程序对不对,谢谢大家~~
注释是我写的,请大家看看对不对CREATE FUNCTION GetPubName  (@ParaOID char(4))--创建用户函数并指定以用户输入的id作为参数
RETURNS Char(120)--返回一个包括所有查出字段(上一个,当前,下一个)以/分隔的字符串
AS
BEGIN
DECLARE 
  @OID CHAR(4),--定义变量,这个可能是游标滚动的指针    
  @pub_name1 CHAR(40),--用来存放上一个记录
  @pub_name2 CHAR(180),--用来存放当前查到的记录
  @pub_name3 CHAR(180)--用来存放下一条记录
Declare Test_Cursor Cursor for--建立游标
  select pub_id,pub_name from publishers for read only--找出待处理数据
Open  Test_Cursor --打开游标Fetch Test_Cursor into @OID,@pub_name1--取出第一条记录并赋给@OID,@pub_name1
while (@@Fetch_Status=0)--Fetch语句是否执行成功
begin
    if @OID=@ParaOID --指针指到的记录就是用户输入的记录
      begin
        set @pub_name2=rtrim(@pub_name2)+'\'+rtrim(@pub_name1)--字符串连接,用\隔开,找到当前用户输入的纪录了,开始pub_name2是空值,那么就把当前用户的纪录赋给pub_name2,第一次可能是这种情况 空值\用户输入当前记录
        Fetch Next from Test_Cursor into @OID,@pub_name1--指针滚动,向下再找一条
        set @pub_name3=rtrim(@pub_name2)+'\'+rtrim(@pub_name1)--同上
      end
    else--如果当前指针没有指到用户输入的
    set @pub_name2=rtrim(@pub_name1)--就一边滚动一边覆盖上一个,整个就是用来存第一个值的方法
    Fetch Test_Cursor into @OID,@pub_name1--这个是干嘛的?找下一条吗??不明确!!
Close Test_Cursor--关闭游标
Deallocate Test_Cursor--删除游标引用
Return(@pub_name3)--返回值
END我还有个弱智的问题,我怎么运行这个函数啊??我从来没有用过函数,我能在查询分析器里面看效果吗??
谢谢大家了

解决方案 »

  1.   

    调用:select dbo.GetPubName('1662')
    --函数没看,不知道对不对
      

  2.   

    哇塞!!能执行了
    开始我试着select GetPubName('1662')就不可以
    加上dbo就可以了
    奇怪~~~~~~谢谢~~Yang_(扬帆破浪)
      

  3.   

    qingyun67(benben兔) 
    我汗!!
      

  4.   

    CREATE FUNCTION GetPubName  (@ParaOID char(4))--创建用户函数并指定以用户输入的id作为参数
    RETURNS Char(120)--返回一个包括所有查出字段(上一个,当前,下一个)以/分隔的字符串
    AS
    BEGIN
    if not exists (select 1 from publishers where pub_id=@ParaOID)  --yang没有数据
       return ('')
       
    DECLARE 
      @OID CHAR(4),--定义变量,这个可能是游标滚动的指针    
      @pub_name1 CHAR(40),--用来存放上一个记录
      @pub_name2 CHAR(180),--用来存放当前查到的记录
      @pub_name3 CHAR(180)--用来存放下一条记录
    Declare Test_Cursor Cursor for--建立游标
      select pub_id,pub_name from publishers for read only--找出待处理数据
    Open  Test_Cursor --打开游标Fetch Test_Cursor into @OID,@pub_name1--取出第一条记录并赋给@OID,@pub_name1
    while (@@Fetch_Status=0)--Fetch语句是否执行成功
    begin
        if @OID=@ParaOID --指针指到的记录就是用户输入的记录
          begin
            set @pub_name2=rtrim(@pub_name2)+'\'+rtrim(@pub_name1)--字符串连接,用\隔开,找到当前用户输入的纪录了,开始pub_name2是空值,那么就把当前用户的纪录赋给pub_name2,第一次可能是这种情况 空值\用户输入当前记录
            Fetch Next from Test_Cursor into @OID,@pub_name1--指针滚动,向下再找一条
            set @pub_name3=rtrim(@pub_name2)+'\'+rtrim(@pub_name1)--同上
            goto theend ---yang 找到了,跳出
          end
        else--如果当前指针没有指到用户输入的
        begin   --yang这里是不是写少了
        set @pub_name2=rtrim(@pub_name1)--就一边滚动一边覆盖上一个,整个就是用来存第一个值的方法
        Fetch Test_Cursor into @OID,@pub_name1--这个是干嘛的?找下一条吗??不明确!!  --yang 没找到就要一直往下找
        end --yang这里是不是写少了
    end --yang应该这里结束循环 少个end能运行吗
    theend:           --yang 加标签 可以跳出
    Close Test_Cursor--关闭游标
    Deallocate Test_Cursor--删除游标引用
    Return(@pub_name3)--返回值
    END   
      

  5.   

    太强了 Yang_(扬帆破浪) 
    原来有这么多好心的人,今天太有收获了等gulf1234(小顾)来了我就结贴~~
      

  6.   

    Yang_(扬帆破浪) 你教给我的及其可能不对的我都记住了,非常感谢paoluo(一天到晚游泳的鱼) 其实不一定要用游标,只不过这个知识我没有掌握,现在我终于弄通了游标,谢谢paoluo(一天到晚游泳的鱼)我尽力不使用游标来做~~也学会了用户函数
      

  7.   

    恩,我昨天也想到这个问题,一旦找到结果后,就退出整个循环,我本来尝试过这样处理;
    在增加一个参数,◎Status,设置成“N”,在找到结果后,设置成“Y”。
    然后在while (@@Fetch_Status=0)中增加一个判断条件◎Status<>'Y'。但是我测试了一下不行,全部返回NULL值。
    (实际上这种方法是可行的,我今天测试过了。昨天失败的原因的我没有在进入循环前对参数◎Status没有设置默认值,系统认为是NULL,当然系统就根据不会进入循环了,自然结果也是NULL)。谢谢Yang_(扬帆破浪),给我提了个醒,可以用GOTO。