日期:2014-05-18  浏览次数:20495 次

求一sql语句,请高手指点,在线等。
有一表:
结构如下
SQL code
CREATE TABLE [dbo].[AB](
    [AA] [nvarchar](50) COLLATE Chinese_PRC_CI_AS NULL,
    [BB] [nvarchar](50) COLLATE Chinese_PRC_CI_AS NULL
) ON [PRIMARY]


插入数据
SQL code

insert into AB(AA,AB)values('A1,A2,A3,A4,A5,A6,A7','A5,A3,A7')
insert into AB(AA,AB)values('张三,李四,王五,赵柳,王八','王八,李四,张三')



求一sql语句,得到查询结果如下:
SQL code

               AA
A1,A2,A3(有),A4,A5(有),A6,A7(有)
张三(有),李四(有),王五,赵柳,王八(有)


请高手指点。

------解决方案--------------------
晕 人都搞晕了拆了和 。人都搞大了。还没搞清楚 !!!!
之前我公司处理这个问题是在程序里做的。

------解决方案--------------------
SQL code

/*
CREATE FUNCTION [dbo].[m_BB]
    (
      @a VARCHAR(2000) ,
      @b VARCHAR(2000) ,
      @split VARCHAR(2)
    )
RETURNS VARCHAR(2000)
AS 
    BEGIN   
        DECLARE @t1 TABLE ( col VARCHAR(2000) )
        WHILE ( CHARINDEX(@split, @a) <> 0 ) 
            BEGIN   
                IF ( SUBSTRING(@a, 1, CHARINDEX(@split, @a) - 1) != ' ' ) 
                    BEGIN
                        INSERT  @t1
                                ( col
                                )
                        VALUES  ( SUBSTRING(@a, 1, CHARINDEX(@split, @a) - 1)
                                )   
                    END
                SET @a = STUFF(@a, 1, CHARINDEX(@split, @a), '')   
            END   
        INSERT  @t1
                ( col )
        VALUES  ( @a ) 
     
        DECLARE @t2 TABLE ( col VARCHAR(2000) )
        WHILE ( CHARINDEX(@split, @b) <> 0 ) 
            BEGIN   
                IF ( SUBSTRING(@b, 1, CHARINDEX(@split, @b) - 1) != ' ' ) 
                    BEGIN
                        INSERT  @t2
                                ( col
                                )
                        VALUES  ( SUBSTRING(@b, 1, CHARINDEX(@split, @b) - 1)
                                )   
                    END
                SET @b = STUFF(@b, 1, CHARINDEX(@split, @b), '')   
            END   
        INSERT  @t2
                ( col )
        VALUES  ( @b )
        DECLARE @sql VARCHAR(2000)
        SET @sql = ''
        SELECT  @sql = @sql + ISNULL(b.col + '(有)', a.col) + ','
        FROM    @t1 a
                LEFT JOIN @t2 b ON a.col = b.col
        RETURN  @sql 
    END
*/


SELECT [dbo].[m_BB](AA,BB,',') AS AA FROM AB
/*
AA
-------------------------------------------
A1,A2,A3(有),A4,A5(有),A6,A7(有),
张三(有),李四(有),王五,赵柳,王八(有),
*/

------解决方案--------------------
SQL code



----drop table ab

CREATE TABLE [dbo].[AB](
    [AA] [nvarchar](50) COLLATE Chinese_PRC_CI_AS NULL,
    [BB] [nvarchar](50) COLLATE Chinese_PRC_CI_AS NULL,
    [CC] [nvarchar](50) COLLATE Chinese_PRC_CI_AS NULL
) ON [PRIMARY]


insert into AB(AA,BB)values('A1,A2,A3,A4,A5,A6,A7','A5,A3,A7')
insert into AB(AA,BB)values('张三,李四,王五,赵柳,王八','王八,李四,张三')

update AB set CC = AA 
/****
将以上数据修改为下面的样子
A1,A2,A3(有),A4,A5(有),A6,A7(有)
张三(有),李四(有),王五,赵柳,王八(有)

***/

declare  @string table
(c_string varchar(20))

delete @string

declare @bb varchar(50),@bb1 varchar(50)
declare @i int,@i0 int ,@tmp varchar(100)
---第一次游标,将bb字段的逗号分隔符字符串变成表变量
declare curs_ab1 cursor
    for 
    select bb from ab

    open curs_ab1
    fetch curs_ab1 into @bb

    while @@fetch_status=0
    begin 
        delete @string
        select @bb=ltrim(rtrim(isnull(@bb,'')))
        set @i=1 
        set @i0 = 0
        while(@i<=len(@bb))
        begin
            if (substring(@bb,@i,1)=',') or