• <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>
  • SQL Server 中 自定義函數 和 游標 應用的經典案例

    發表于:2007-05-25來源:作者:點擊數: 標簽:sql用的游標自定義server
    這是網友的問題,我當時立馬給出了自己的 解決方案 ,但是沒有想到中間有點小問題,發現后經過自己仔細調試,完全得到正確結果后,那個網友已經結帖了。我的代碼遂成為雞肋,食之無味,棄之可惜。但是我覺得我的代碼確實還是挺經典的,所以整理了一下,供各

        這是網友的問題,我當時立馬給出了自己的解決方案,但是沒有想到中間有點小問題,發現后經過自己仔細調試,完全得到正確結果后,那個網友已經結帖了。我的代碼遂成為雞肋,食之無味,棄之可惜。但是我覺得我的代碼確實還是挺經典的,所以整理了一下,供各位網友欣賞。
    問題:
     

    假設環境如下:

        表1:      ID, NAME,      QQ,     PHONE,

    表中數據:      1       秦云        10102800 13500000

                    2       在路上      10378    13600000

                    3       LEO         10000    13900000

     

        表2:      ID, NAME,  上機時間,管理員,

    表中數據:     1   秦云    2004-1-1  李大偉

                   2   秦云    2005-1-1  馬化騰

                   3    在路上  2005-1-1  馬化騰

                   4    秦云   2005-1-1  李大偉

                   5   在路上 2005-1-1  李大偉

     

    實現目的:從表1中取所有人員列表,從表2中取上機次數和管理員.

                 上機人員名單    上機次數   管理員(上這幾次機的每個管理員都列出來)

                   秦云             3             李大偉,馬化騰,李大偉

                   在路上           2            馬化騰,李大偉

                   LEO              0      

    如果不算管理員那一列的話,我是這樣寫的。

    SELECT  表1.NAME AS 姓名, COUNT(表2.ID) AS 上機次數

    FROM  表1 LEFT OUTER JOIN

          表2 ON 表1.NAME = 表2.NAME

    GROUP BY 表1.名稱

     

    解答:
    測試用例

     

    create table 表1( --drop table 表1

    ID     int,

    NAME   varchar(10),

    QQ     varchar(10),

    PHONE  varchar(20)

    )

     

    insert into 表1 values(1   ,'秦云'    ,'10102800'     ,'13500000')

    insert into 表1 values(2   ,'在路上'  ,'10378'        ,'13600000')

    insert into 表1 values(3   ,'LEO'     ,'10000'        ,'13900000')

     

    create table 表2( --drop table 表2

    ID        int,

    NAME    varchar(10) ,

    上機時間  datetime,

    管理員    varchar(10)

    )

     

    insert into 表2  values(1,'秦云'   ,cast('2004-1-1' as datetime),'李大偉')

    insert into 表2  values(2,'秦云'   ,cast('2005-1-1' as datetime),'馬化騰')

    insert into 表2  values (3,'在路上' ,cast('2005-1-1' as datetime),'馬化騰')

    insert into 表2  values(4,'秦云'   ,cast('2005-1-1' as datetime),'李大偉')

    insert into 表2  values(5,'在路上' ,cast('2005-1-1' as datetime),'李大偉')

     

    程序部分

     

    create function GetNameStr(@name nvarchar(10))

    returns nvarchar(800)

    as

    begin

        declare @nameStr nvarchar(800)

        declare @tempStr nvarchar(800)

        declare @flag int

        declare myCur cursor for ( select 管理員 from 表2 where 表2.NAME = @name )

        open myCur

        fetch next from myCur into @tempStr

        set @flag = 0

        while @@fetch_status = 0

        begin

            if @flag = 0

        begin

            set @nameStr = @tempStr

        end

        else

        begin

            set @nameStr = @nameStr + ',' + @tempStr

        end

        set @flag = @flag + 1

        fetch next from myCur into @tempStr

        end

        close myCur

        deallocate myCur

        return @nameStr

    end

     

    select 表2.NAME as 姓名, count(ID) as 上機次數, dbo.GetNameStr(表2.NAME) as 管理員

    from 表2

    where 表2.NAME in ( select 表1.NAME from 表1 )

    group by 表2.NAME

     

     

    測試結果:

     

    姓名    上機次數    管理員

    --------------------------------------------------------------

    秦云        3       李大偉,馬化騰,李大偉

    在路上      2       馬化騰,李大偉

     


    原文轉自:http://www.kjueaiud.com

    老湿亚洲永久精品ww47香蕉图片_日韩欧美中文字幕北美法律_国产AV永久无码天堂影院_久久婷婷综合色丁香五月

  • <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>