表:student(id int,name varchar(10))
1 a
2 b
3 c    等select name from student where id in (1,2,3)
想写一个函数
字符串1,2,3为输入
把name连成字符串 a,b,c  输出
 怎么写
急,在线等

解决方案 »

  1.   

    create function test(@a int)
    return varchar(30)
    as
    begin
    declare @temp varchar(30)
    select @temp=@temp+column2
    from tb
    where column1=@a
    endselect colmn1,testcolmn1)
    from tb
      

  2.   

    declare @student table(id int,name varchar(10)) 
    insert into @student select 1,'a' 
    insert into @student select 2,'b' 
    insert into @student select 3,'c' declare @str varchar(100)
    set @str='1,2,3'select 
        @str=substring(replace(','+@str+',',','+rtrim(id)+',',','+name+','),2,len(replace(','+@str+',',','+rtrim(id)+',',','+name+','))-2)
    from 
        @studentprint @str
    --a,b,c
      

  3.   

    create table tb (CardNo int,CardName varchar(10))
    insert tb
    select 1,        'AA' union all
    select 2,        'BB' union all
    select 3,        'CC' go
    CREATE FUNCTION dbo.f_tb(@id varchar(10)) 
    RETURNS varchar(8000) 
    AS 
    BEGIN 
        DECLARE @str varchar(8000) 
        SET @str = '' 
        SELECT @str = @str + ',' + CardName FROM tb WHERE charindex(cast(CardNo as varchar(10)),@id)>0
        RETURN STUFF(@str, 1, 1, '') 
    END 
    GO 
    declare @s varchar(10) 
    set @s='1,2,3'
    select  dbo.f_tb(@s)----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
    AA,BB,CC(1 行受影响)
      

  4.   

    --各种字符串分函数--3.3.1 使用游标法进行字符串合并处理的示例。
    --处理的数据
    CREATE TABLE tb(col1 varchar(10),col2 int)
    INSERT tb SELECT 'a',1
    UNION ALL SELECT 'a',2
    UNION ALL SELECT 'b',1
    UNION ALL SELECT 'b',2
    UNION ALL SELECT 'b',3--合并处理
    --定义结果集表变量
    DECLARE @t TABLE(col1 varchar(10),col2 varchar(100))--定义游标并进行合并处理
    DECLARE tb CURSOR LOCAL
    FOR
    SELECT col1,col2 FROM tb ORDER BY  col1,col2
    DECLARE @col1_old varchar(10),@col1 varchar(10),@col2 int,@s varchar(100)
    OPEN tb
    FETCH tb INTO @col1,@col2
    SELECT @col1_old=@col1,@s=''
    WHILE @@FETCH_STATUS=0
    BEGIN
    IF @col1=@col1_old
    SELECT @s=@s+','+CAST(@col2 as varchar)
    ELSE
    BEGIN
    INSERT @t VALUES(@col1_old,STUFF(@s,1,1,''))
    SELECT @s=','+CAST(@col2 as varchar),@col1_old=@col1
    END
    FETCH tb INTO @col1,@col2
    END
    INSERT @t VALUES(@col1_old,STUFF(@s,1,1,''))
    CLOSE tb
    DEALLOCATE tb
    --显示结果并删除测试数据
    SELECT * FROM @t
    DROP TABLE tb
    /*--结果
    col1       col2
    ---------- -----------
    a          1,2
    b          1,2,3
    --*/
    GO
    /*==============================================*/
    --3.3.2 使用用户定义函数,配合SELECT处理完成字符串合并处理的示例
    --处理的数据
    CREATE TABLE tb(col1 varchar(10),col2 int)
    INSERT tb SELECT 'a',1
    UNION ALL SELECT 'a',2
    UNION ALL SELECT 'b',1
    UNION ALL SELECT 'b',2
    UNION ALL SELECT 'b',3
    GO--合并处理函数
    CREATE FUNCTION dbo.f_str(@col1 varchar(10))
    RETURNS varchar(100)
    AS
    BEGIN
    DECLARE @re varchar(100)
    SET @re=''
    SELECT @re=@re+','+CAST(col2 as varchar)
    FROM tb
    WHERE col1=@col1
    RETURN(STUFF(@re,1,1,''))
    END
    GO--调用函数
    SELECT col1,col2=dbo.f_str(col1) FROM tb GROUP BY col1
    --删除测试
    DROP TABLE tb
    DROP FUNCTION f_str
    /*--结果
    col1       col2
    ---------- -----------
    a          1,2
    b          1,2,3
    --*/
    GO/*==============================================*/
    --3.3.3 使用临时表实现字符串合并处理的示例
    --处理的数据
    CREATE TABLE tb(col1 varchar(10),col2 int)
    INSERT tb SELECT 'a',1
    UNION ALL SELECT 'a',2
    UNION ALL SELECT 'b',1
    UNION ALL SELECT 'b',2
    UNION ALL SELECT 'b',3--合并处理
    SELECT col1,col2=CAST(col2 as varchar(100)) 
    INTO #t FROM tb
    ORDER BY col1,col2
    DECLARE @col1 varchar(10),@col2 varchar(100)
    UPDATE #t SET 
    @col2=CASE WHEN @col1=col1 THEN @col2+','+col2 ELSE col2 END,
    @col1=col1,
    col2=@col2
    SELECT * FROM #t
    /*--更新处理后的临时表
    col1       col2
    ---------- -------------
    a          1
    a          1,2
    b          1
    b          1,2
    b          1,2,3
    --*/
    --得到最终结果
    SELECT col1,col2=MAX(col2) FROM #t GROUP BY col1
    /*--结果
    col1       col2
    ---------- -----------
    a          1,2
    b          1,2,3
    --*/
    --删除测试
    DROP TABLE tb,#t
    GO
    /*==============================================*/--3.3.4.1 每组 <=2 条记录的合并
    --处理的数据
    CREATE TABLE tb(col1 varchar(10),col2 int)
    INSERT tb SELECT 'a',1
    UNION ALL SELECT 'a',2
    UNION ALL SELECT 'b',1
    UNION ALL SELECT 'b',2
    UNION ALL SELECT 'c',3--合并处理
    SELECT col1,
    col2=CAST(MIN(col2) as varchar)
    +CASE 
    WHEN COUNT(*)=1 THEN ''
    ELSE ','+CAST(MAX(col2) as varchar)
    END
    FROM tb
    GROUP BY col1
    DROP TABLE tb
    /*--结果
    col1       col2      
    ---------- ----------
    a          1,2
    b          1,2
    c          3
    --*/--3.3.4.2 每组 <=3 条记录的合并
    --处理的数据
    CREATE TABLE tb(col1 varchar(10),col2 int)
    INSERT tb SELECT 'a',1
    UNION ALL SELECT 'a',2
    UNION ALL SELECT 'b',1
    UNION ALL SELECT 'b',2
    UNION ALL SELECT 'b',3
    UNION ALL SELECT 'c',3--合并处理
    SELECT col1,
    col2=CAST(MIN(col2) as varchar)
    +CASE 
    WHEN COUNT(*)=3 THEN ','
    +CAST((SELECT col2 FROM tb WHERE col1=a.col1 AND col2 NOT IN(MAX(a.col2),MIN(a.col2))) as varchar)
    ELSE ''
    END
    +CASE 
    WHEN COUNT(*)>=2 THEN ','+CAST(MAX(col2) as varchar)
    ELSE ''
    END
    FROM tb a
    GROUP BY col1
    DROP TABLE tb
    /*--结果
    col1       col2
    ---------- ------------
    a          1,2
    b          1,2,3
    c          3
    --*/
    GO
    geini资料看看
      

  5.   

    set ANSI_NULLS ON
    set QUOTED_IDENTIFIER ON
    goALTER FUNCTION [dbo].[ShowLabelName]
    (
    @LabelIds nvarchar(200)
    )
    RETURNS nvarchar(1000)
    AS
    BEGIN
    declare @LabelNames nvarchar(1000);
    Declare @i int;
         Declare @Start int;
         Declare @Length int;
         Declare @TotalLenght int;     Set @i = 1;
         Set @Start = 1;
         Set @Length = 0;
         Set @TotalLenght = Len(@LabelIds);     While(@i <= @TotalLenght)
            Begin
                If(SubString(@LabelIds, @i, 1) = ',')
                    Begin
                        select @LabelNames = @LabelNames + [name] from NB_LABEL_MAIN Where ID = SubString(@LabelIds, @Start, @Length);
                        Set @Start = @i + 1;
                        Set @Length = 0;
                    End
                Else
                    Begin
                        Set @Length = @Length + 1;
                    End
                    Set @i = @i + 1;
                End     If(Right(@LabelIds, 1) <> ',')
            Begin
                select @LabelNames = @LabelNames + [name] from NB_LABEL_MAIN Where ID = SubString(@LabelIds, @Start, @Length);
            End
    return @LabelNames
    End
    Go这是我写的,头一次啊,以下是错误,谁帮我看看啊
    消息 102,级别 15,状态 1,过程 ShowLabelName,第 11 行
    ' ' 附近有语法错误。
    消息 102,级别 15,状态 1,过程 ShowLabelName,第 12 行
    ' ' 附近有语法错误。
    消息 102,级别 15,状态 1,过程 ShowLabelName,第 13 行
    ' ' 附近有语法错误。
    消息 102,级别 15,状态 1,过程 ShowLabelName,第 15 行
    ' ' 附近有语法错误。
    消息 102,级别 15,状态 1,过程 ShowLabelName,第 16 行
    ' ' 附近有语法错误。
    消息 102,级别 15,状态 1,过程 ShowLabelName,第 17 行
    ' ' 附近有语法错误。
    消息 102,级别 15,状态 1,过程 ShowLabelName,第 18 行
    ' ' 附近有语法错误。
    消息 102,级别 15,状态 1,过程 ShowLabelName,第 20 行
    ' ' 附近有语法错误。
    消息 102,级别 15,状态 1,过程 ShowLabelName,第 21 行
    ' ' 附近有语法错误。
    消息 102,级别 15,状态 1,过程 ShowLabelName,第 23 行
    ' ' 附近有语法错误。
    消息 102,级别 15,状态 1,过程 ShowLabelName,第 25 行
    ' ' 附近有语法错误。
    消息 102,级别 15,状态 1,过程 ShowLabelName,第 26 行
    ' ' 附近有语法错误。
    消息 102,级别 15,状态 1,过程 ShowLabelName,第 27 行
    ' ' 附近有语法错误。
    消息 102,级别 15,状态 1,过程 ShowLabelName,第 31 行
    ' ' 附近有语法错误。
    消息 102,级别 15,状态 1,过程 ShowLabelName,第 33 行
    ' ' 附近有语法错误。
    消息 102,级别 15,状态 1,过程 ShowLabelName,第 36 行
    ' ' 附近有语法错误。
    消息 102,级别 15,状态 1,过程 ShowLabelName,第 38 行
    ' ' 附近有语法错误。
    消息 102,级别 15,状态 1,过程 ShowLabelName,第 40 行
    'End' 附近有语法错误。
      

  6.   

    set ANSI_NULLS ON 
    set QUOTED_IDENTIFIER ON 
    go ALTER FUNCTION [dbo].[ShowLabelName] 

    @LabelIds nvarchar(200) 

    RETURNS nvarchar(1000) 
    AS 
    BEGIN 
    declare @LabelNames nvarchar(1000); 
    Declare @i int; 
         Declare @Start int; 
        Declare @Length int; 
        Declare @TotalLenght int; 
           Set @i = 1; 
        Set @Start = 1; 
        Set @Length = 0; 
        Set @TotalLenght = Len(@LabelIds); 
        While(@i <= @TotalLenght) 
            Begin 
            If(SubString(@LabelIds, @i, 1) = ',') 
                    Begin 
                    select @LabelNames = @LabelNames + [name] from NB_LABEL_MAIN Where ID = SubString(@LabelIds, @Start, @Length); 
                        Set @Start = @i + 1; 
                        Set @Length = 0; 
          End 
         Else 
            Begin 
           Set @Length = @Length + 1; 
            End 
              Set @i = @i + 1; 
          End 
          If(Right(@LabelIds, 1) <> ',') 
            Begin 
           select @LabelNames = @LabelNames + [name] from NB_LABEL_MAIN Where ID = SubString(@LabelIds, @Start, @Length); 
            End 
    return @LabelNames 
    End 
    Go 
      

  7.   

    create  table  student (id int,name varchar(10)) 
    insert into  student select 1,'a' 
    insert into  student select 2,'b' 
    insert into  student select 3,'c' create function abc(@str varchar(20)) 
     returns varchar(20)
    as
    begin
    declare @strr varchar(50)
    select @strr=isnull(@strr+',','')+name from  student where charindex(ltrim(id),@str)>0
    return @strr
    endselect  dbo.abc('1,2,3')/*
    --------------------
    a,b,c(1 行受影响)
    *
    /
      

  8.   

    6楼的方法没错,但是有漏洞:
    比如,执行:select  dbo.f_tb('11,2,3')的时候会把ID为1的记录也加如到串中,
    我改了下,其他地方我没动:如下
    create table tb (CardNo int,CardName varchar(10))
    insert tb
    select 1,        'AA' union all
    select 2,        'BB' union all
    select 3,        'CC' go
    alter FUNCTION dbo.f_tb(@id varchar(10)) 
    RETURNS varchar(8000) 
    AS 
    BEGIN 
        DECLARE @str varchar(8000) 
        SET @str = '' 
        SELECT @str = @str + ',' + CardName FROM tb WHERE charindex(','+cast(CardNo as varchar(10))+',',','+@id+',')>0
        RETURN STUFF(@str, 1, 1, '') 
    END 
    GO 
    declare @s varchar(10) 
    set @s='1,2,3'
    select  dbo.f_tb(@s)
    drop table tb