求一sql语句,请高手指点,在线等。
有一表:
结构如下
CREATE TABLE [dbo].[AB]( [AA] [nvarchar](50) COLLATE Chinese_PRC_CI_AS NULL, [BB] [nvarchar](50) COLLATE Chinese_PRC_CI_AS NULL) ON [PRIMARY]
insert into AB(AA,AB)values('A1,A2,A3,A4,A5,A6,A7','A5,A3,A7')insert into AB(AA,AB)values('张三,李四,王五,赵柳,王八','王八,李四,张三')AAA1,A2,A3(有),A4,A5(有),A6,A7(有)张三(有),李四(有),王五,赵柳,王八(有)
/*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(有),张三(有),李四(有),王五,赵柳,王八(有),*/
[解决办法]
----drop table abCREATE 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 @stringdeclare @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 @i=len(@bb) begin set @tmp = substring(@bb,@i0+1,@i - @i0 ) if not (@tmp is null or @tmp = '') begin insert into @string(c_string) select replace(@tmp,',','') end set @i0 = @i end set @i=@i+1 end ---第二次游标,将bb字段分割出的表变量比较aa字段,并将**替换为 **(有) declare curs_ab2 cursor for select c_string from @string open curs_ab2 fetch curs_ab2 into @bb1 while @@fetch_status=0 begin update AB set CC = REPLACE(cc,@bb1,@bb1+'(有)') from AB where BB = @bb fetch curs_ab2 into @bb1 end close curs_ab2 deallocate curs_ab2 fetch curs_ab1 into @bb end close curs_ab1 deallocate curs_ab1 select cc from ab/****A1,A2,A3(有),A4,A5(有),A6,A7(有)张三(有),李四(有),王五,赵柳,王八(有)****/