--建立测试环境
Create Table TEST
(ID Varchar(10),
 Name  Nvarchar(10))
Insert TEST Values('01',   N'小张')
Insert TEST Values('01',   N'小王')
Insert TEST Values('02',   N'小王')
Insert TEST Values('02',   N'小陈')
GO
--建立函数
Create Function GetName(@ID Int)
Returns Nvarchar(2000)
As
Begin
    Declare @S Nvarchar(2000)
    Set @S=''
    Select @S=@S+';'+Name from TEST Where ID=@ID Order By Name
    Return (Stuff(@S,1,1,''))
End
GO
--测试
Select ID,dbo.GetName(ID) As Name from TEST Group By ID
--删除测试环境
Drop Table TEST
Drop Function GetName
GO
--结果
/*
ID Name
01 小张;小王
02 小王;小陈
*/

解决方案 »

  1.   

    create function pmerg(@id int)
    returns varchar(8000)
    as
    begin
    declare @s varchar(8000)
    set @s=''
    select @s=@s+';'+name from y where id=@id
    set @s=right(@s,len(@s)-1)
    return(@s)
    Endselect  distinct  id,  dbo.pmerg(id)  from  y
      

  2.   

    declare @id varchar(50),@name varchar(1000)
    select @id='',@name=''
    update table1 set @name=case when id=@id then @name+';'+name else name end
    ,@id=id,name=@name
    select id ,max(name) from table1 group by id
      

  3.   

    to paoluo(一天到晚游泳的鱼) :我是初学者,请问如果写个存储过程来完成以上工作,是要在该存储过程里动态创建一个函数,最后在drop掉这个函数吗?谢谢!
      

  4.   

    函数就可以,为什么要用存储过程呢??如果是要用存储过程,你可以在存储过程直接调用这个函数,不用Drop掉的。
      

  5.   

    to paoluo(一天到晚游泳的鱼):我是初学者,不太懂。请问如果不在存储过程里创建函数,应该在什么地方创建呢?谢谢!
      

  6.   

    请教paoluo(一天到晚游泳的鱼):
    我有两个表,一个里面保存的类似“1,2,4,”这样的记录,里面的1、2、4分别对应另一个表的ID,我如何取出另一个表的其他字段?
    比如: 
    表1:
    刘若英 1,2
    表2:
    1 歌星
    2 演员
    3 影星
    我要得到:
    刘若英 歌星,演员
      

  7.   

    将这段代码复制到查询分析器中,将数据库改为你要建函数的数据库,然后点运行就可以建立函数了。--建立函数
    Create Function GetName(@ID Int)
    Returns Nvarchar(2000)
    As
    Begin
        Declare @S Nvarchar(2000)
        Set @S=''
        Select @S=@S+';'+Name from TEST Where ID=@ID Order By Name
        Return (Stuff(@S,1,1,''))
    End
    GO
      

  8.   

    to  paoluo(一天到晚游泳的鱼):谢谢!请问什么时候需要从数据库里边删除这个函数呢?
      

  9.   

    /*
    to iuhxq:
    我对你的问题写了一种解法, 你看看合不合要求
    PS:建议不要在人家的帖子里杂一些其它问题, 那样帖子会很乱, 而且也不会有太多人注意你的问题*/
    --测试数据
    create table t1(name varchar(10), id varchar(10))
    create table t2(id varchar(10), type varchar(10))
    insert t1  select '刘若英', '1,2'
    union  all select '刘德华', '1,2,3'
    insert t2  select '1', '歌星'
    union  all select '2', '演员'
    union  all select '3', '影星'
    go
    --主要部分
    --创建UDF
    Create Function dbo.GetType(@name varchar(10))
    Returns Nvarchar(2000)
    As
    Begin
        Declare @S Nvarchar(2000)
        Set @S=''
        Select @S=@S+','+type from (select name, type 
    from t1 join t2
    on charindex(t2.id, t1.id)<>0)t
        Where Name=@Name
        Return (Stuff(@S,1,1,''))
    End
    GO
    --查询
    select distinct name, type=dbo.GetType(name)
    from t1 join t2 
    on charindex(t2.id, t1.id)<>0
    --清除
    drop table t1
    drop table t2
    drop Function dbo.GetType
      

  10.   

    /*
    to 楼主:我想游鱼的意思应该是下面的.(这个题目还可以不用用户自定义函数来做. 不过用户自定义函数是标准解法, 高效, 直观)。楼主需要的话,我可以写一下,低效, 不直观的解法。
    */
    --测试数据
    Create Table TEST
    (ID Varchar(10),
     Name  Nvarchar(10))
    Insert TEST Values('01',   N'小张')
    Insert TEST Values('01',   N'小王')
    Insert TEST Values('02',   N'小王')
    Insert TEST Values('02',   N'小陈')
    GO
    --主要部分
    --建立函数
    Create Function GetName(@ID Int)
    Returns Nvarchar(2000)
    As
    Begin
        Declare @S Nvarchar(2000)
        Set @S=''
        Select @S=@S+';'+Name from TEST Where ID=@ID Order By Name
        Return (Stuff(@S,1,1,''))
    End
    GO
    create proc proc_test
    as
    Select ID,dbo.GetName(ID) As Name from TEST Group By ID
    go
    --测试
    exec proc_test--清除
    drop table test
    drop function dbo.GetName
    drop proc proc_test
      

  11.   

    to filebat(Mark):
    谢谢,我是觉得自己的问题跟楼主的差不多,呵呵id是int型,你的答案跟我的目的还有点不同