我的表结构如下:
CREATE TABLE [TA] (  [ID] [int] IDENTITY (1, 1) NOT NULL , [Col] [varchar] (50) NULL ) SET IDENTITY_INSERT [TA] ON INSERT [TA] ( [ID] , [Col] ) VALUES ( 1 , '1' )
 INSERT [TA] ( [ID] , [Col] ) VALUES ( 2 , '1,3,' )
 INSERT [TA] ( [ID] , [Col] ) VALUES ( 3 , '1,2,3' )
 INSERT [TA] ( [ID] , [Col] ) VALUES ( 4 , '1,2,5' )
 INSERT [TA] ( [ID] , [Col] ) VALUES ( 5 , '1,8' )
 INSERT [TA] ( [ID] , [Col] ) VALUES ( 6 , '2,5' )
 INSERT [TA] ( [ID] , [Col] ) VALUES ( 7 , '2,4,3' )
 INSERT [TA] ( [ID] , [Col] ) VALUES ( 8 , '2,8,1' ) SET IDENTITY_INSERT [TA] OFF
 CREATE TABLE [TB] (  [ID] [int] IDENTITY (1, 1) NOT NULL , [ColCode] [varchar] (50) NULL , [ColName] [varchar] (50) NULL ) SET IDENTITY_INSERT [TB] ON INSERT [TB] ( [ID] , [ColCode] , [ColName] ) VALUES ( 1 , '1' , '第一' )
 INSERT [TB] ( [ID] , [ColCode] , [ColName] ) VALUES ( 2 , '2' , '第二' )
 INSERT [TB] ( [ID] , [ColCode] , [ColName] ) VALUES ( 3 , '3' , '第三' )
 INSERT [TB] ( [ID] , [ColCode] , [ColName] ) VALUES ( 4 , '4' , '第四' )
 INSERT [TB] ( [ID] , [ColCode] , [ColName] ) VALUES ( 5 , '5' , '第五' ) SET IDENTITY_INSERT [TB] OFF
显示记录如下:
select * from TA
ID      Col
1 1
2 1,3,
3 1,2,3
4 1,2,5
5 1,8
6 2,5
7 2,4,3
8 2,8,1select * from TB
ID ColCode ColName
1 1 第一
2 2 第二
3 3 第三
4 4 第四
5 5 第五
我想得到格式如下:ID      Col
1 第一
2 第一,第三,
3 第一,第二,第三
4 第一,第二,5
5 第一,8
6 第二,第五
7 第二,第四,第三
8 第二,8,第一
意思就是把TA字段的Col的Code值换为Name,如果不存在的话,仍然保留,多谢了!

解决方案 »

  1.   

    CREATE TABLE [TA] (  [ID] [int] IDENTITY (1, 1) NOT NULL , [Col] [varchar] (50) NULL ) SET IDENTITY_INSERT [TA] ON INSERT [TA] ( [ID] , [Col] ) VALUES ( 1 , '1' ) 
    INSERT [TA] ( [ID] , [Col] ) VALUES ( 2 , '1,3,' ) 
    INSERT [TA] ( [ID] , [Col] ) VALUES ( 3 , '1,2,3' ) 
    INSERT [TA] ( [ID] , [Col] ) VALUES ( 4 , '1,2,5' ) 
    INSERT [TA] ( [ID] , [Col] ) VALUES ( 5 , '1,8' ) 
    INSERT [TA] ( [ID] , [Col] ) VALUES ( 6 , '2,5' ) 
    INSERT [TA] ( [ID] , [Col] ) VALUES ( 7 , '2,4,3' ) 
    INSERT [TA] ( [ID] , [Col] ) VALUES ( 8 , '2,8,1' ) SET IDENTITY_INSERT [TA] OFF 
    CREATE TABLE [TB] (  [ID] [int] IDENTITY (1, 1) NOT NULL , [ColCode] [varchar] (50) NULL , [ColName] [varchar] (50) NULL ) SET IDENTITY_INSERT [TB] ON INSERT [TB] ( [ID] , [ColCode] , [ColName] ) VALUES ( 1 , '1' , '第一' ) 
    INSERT [TB] ( [ID] , [ColCode] , [ColName] ) VALUES ( 2 , '2' , '第二' ) 
    INSERT [TB] ( [ID] , [ColCode] , [ColName] ) VALUES ( 3 , '3' , '第三' ) 
    INSERT [TB] ( [ID] , [ColCode] , [ColName] ) VALUES ( 4 , '4' , '第四' ) 
    INSERT [TB] ( [ID] , [ColCode] , [ColName] ) VALUES ( 5 , '5' , '第五' ) SET IDENTITY_INSERT [TB] OFF gocreate function f_getstr(@Col varchar(50))
       returns varchar(200)
    as
    begin
       declare @re varchar(200)
       set @re=''
       select @re=@re+','+ColName
       from TB
       where charindex(ColCode,@Col)>0
       
       return stuff(@re,1,1,'')
    end
    go
    select ID,dbo.f_getstr(Col) ColName
    from TA
    go
    drop table TA,TB
    drop function f_getstr/*
    ID          ColName
    ----------- --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
    1           第一
    2           第一,第三
    3           第一,第二,第三
    4           第一,第二,第五
    5           第一
    6           第二,第五
    7           第二,第三,第四
    8           第一,第二(8 行受影响)
    */
      

  2.   

    CREATE TABLE [TA] (  [ID] [int] IDENTITY (1, 1) NOT NULL , [Col] [varchar] (50) NULL ) SET IDENTITY_INSERT [TA] ON INSERT [TA] ( [ID] , [Col] ) VALUES ( 1 , '1' ) 
    INSERT [TA] ( [ID] , [Col] ) VALUES ( 2 , '1,3,' ) 
    INSERT [TA] ( [ID] , [Col] ) VALUES ( 3 , '1,2,3' ) 
    INSERT [TA] ( [ID] , [Col] ) VALUES ( 4 , '1,2,5' ) 
    INSERT [TA] ( [ID] , [Col] ) VALUES ( 5 , '1,8' ) 
    INSERT [TA] ( [ID] , [Col] ) VALUES ( 6 , '2,5' ) 
    INSERT [TA] ( [ID] , [Col] ) VALUES ( 7 , '2,4,3' ) 
    INSERT [TA] ( [ID] , [Col] ) VALUES ( 8 , '2,8,1' ) SET IDENTITY_INSERT [TA] OFF 
    CREATE TABLE [TB] (  [ID] [int] IDENTITY (1, 1) NOT NULL , [ColCode] [varchar] (50) NULL , [ColName] [varchar] (50) NULL ) SET IDENTITY_INSERT [TB] ON INSERT [TB] ( [ID] , [ColCode] , [ColName] ) VALUES ( 1 , '1' , '第一' ) 
    INSERT [TB] ( [ID] , [ColCode] , [ColName] ) VALUES ( 2 , '2' , '第二' ) 
    INSERT [TB] ( [ID] , [ColCode] , [ColName] ) VALUES ( 3 , '3' , '第三' ) 
    INSERT [TB] ( [ID] , [ColCode] , [ColName] ) VALUES ( 4 , '4' , '第四' ) 
    INSERT [TB] ( [ID] , [ColCode] , [ColName] ) VALUES ( 5 , '5' , '第五' ) SET IDENTITY_INSERT [TB] OFF gocreate function f_getstr(@Col varchar(50))
       returns varchar(200)
    as
    begin
       select @Col=replace(@Col,ColCode,ColName)
       from TB
       where charindex(ColCode,@Col)>0
       
       return @Col
    end
    go
    select ID,dbo.f_getstr(Col) ColName
    from TA
    go
    drop table TA,TB
    drop function f_getstr
    /*
    ID          ColName
    ----------- --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
    1           第一
    2           第一,第三,
    3           第一,第二,第三
    4           第一,第二,第五
    5           第一,8
    6           第二,第五
    7           第二,第四,第三
    8           第二,8,第一(8 行受影响)
    */
      

  3.   

    To 小梁(幸福,這麼遠,那麼甜...!)哎呀,主要现在手上有点东西要做呀,如果你不忙的话,就帮着改一下,如果忙的话,就先放一下,没事的,多谢你了如果我的TB表中再加个字段OtherCol,然后再根据OtherCol不同的值进行匹配,不知能不能在函数里动态去执行,多谢你了,如果忙的话,就放放吧
      

  4.   

    CREATE TABLE [TA] (  [ID] [int] IDENTITY (1, 1) NOT NULL , [Col] [varchar] (50) NULL ) SET IDENTITY_INSERT [TA] ON INSERT [TA] ( [ID] , [Col] ) VALUES ( 1 , '1' ) 
    INSERT [TA] ( [ID] , [Col] ) VALUES ( 2 , '1,3,' ) 
    INSERT [TA] ( [ID] , [Col] ) VALUES ( 3 , '1,2,3' ) 
    INSERT [TA] ( [ID] , [Col] ) VALUES ( 4 , '1,2,5' ) 
    INSERT [TA] ( [ID] , [Col] ) VALUES ( 5 , '1,8' ) 
    INSERT [TA] ( [ID] , [Col] ) VALUES ( 6 , '2,5' ) 
    INSERT [TA] ( [ID] , [Col] ) VALUES ( 7 , '2,4,3' ) 
    INSERT [TA] ( [ID] , [Col] ) VALUES ( 8 , '2,8,1' ) SET IDENTITY_INSERT [TA] OFF 
    CREATE TABLE [TB] (  [ID] [int] IDENTITY (1, 1) NOT NULL , [ColCode] [varchar] (50) NULL , [ColName] [varchar] (50) NULL ) SET IDENTITY_INSERT [TB] ON INSERT [TB] ( [ID] , [ColCode] , [ColName] ) VALUES ( 1 , '1' , '第一' ) 
    INSERT [TB] ( [ID] , [ColCode] , [ColName] ) VALUES ( 2 , '2' , '第二' ) 
    INSERT [TB] ( [ID] , [ColCode] , [ColName] ) VALUES ( 3 , '3' , '第三' ) 
    INSERT [TB] ( [ID] , [ColCode] , [ColName] ) VALUES ( 4 , '4' , '第四' ) 
    INSERT [TB] ( [ID] , [ColCode] , [ColName] ) VALUES ( 5 , '5' , '第五' ) SET IDENTITY_INSERT [TB] OFF GO
    SELECT a.*,colName=STUFF(ColNameS.value('/R[1]','nvarchar(max)'),1,1,'') FROM ta a
    CROSS APPLY
    (SELECT ColNameS=(
    SELECT N','+colName FROM tb 
    WHERE CHARINDEX(','+colCode+',',','+col+',')>0 
    ORDER BY CHARINDEX(','+colCode+',',','+col+',')
    FOR XML PATH(''),ROOT('R'),TYPE
    )
    )b
    GO
    /*
    1 1 第一
    2 1,3, 第一,第三
    3 1,2,3 第一,第二,第三
    4 1,2,5 第一,第二,第五
    5 1,8 第一
    6 2,5 第二,第五
    7 2,4,3 第二,第四,第三
    8 2,8,1 第二,第一*/
    DROP TABLE ta
    DROP TABLE tb
    GO
      

  5.   

    CREATE TABLE [TA] (  [ID] [int] IDENTITY (1, 1) NOT NULL , [Col] [varchar] (50) NULL , [ColB] [varchar] (50) NULL ) SET IDENTITY_INSERT [TA] ON INSERT [TA] ( [ID] , [Col] , [ColB] ) VALUES ( 1 , '1' , '1,3,' )
     INSERT [TA] ( [ID] , [Col] , [ColB] ) VALUES ( 2 , '1,3,' , '5' )
     INSERT [TA] ( [ID] , [Col] , [ColB] ) VALUES ( 3 , '1,2,3' , '6' )
     INSERT [TA] ( [ID] , [Col] , [ColB] ) VALUES ( 4 , '1,2,5' , '1,6,' )
     INSERT [TA] ( [ID] , [Col] , [ColB] ) VALUES ( 5 , '1,8' , '2,8' )
     INSERT [TA] ( [ID] , [Col] , [ColB] ) VALUES ( 6 , '2,5' , '1,6,7' )
     INSERT [TA] ( [ID] , [Col] , [ColB] ) VALUES ( 7 , '2,4,3' , '7,' )
     INSERT [TA] ( [ID] , [Col] , [ColB] ) VALUES ( 8 , '2,8,1' , '4,' ) SET IDENTITY_INSERT [TA] OFF CREATE TABLE [TB] (  [ID] [int] IDENTITY (1, 1) NOT NULL , [ColCode] [varchar] (50) NULL , [ColName] [varchar] (50) NULL , [ColType] [varchar] (50) NULL ) SET IDENTITY_INSERT [TB] ON INSERT [TB] ( [ID] , [ColCode] , [ColName] , [ColType] ) VALUES ( 1 , '1' , '第一' , 'A' )
     INSERT [TB] ( [ID] , [ColCode] , [ColName] , [ColType] ) VALUES ( 2 , '2' , '第二' , 'A' )
     INSERT [TB] ( [ID] , [ColCode] , [ColName] , [ColType] ) VALUES ( 3 , '3' , '第三' , 'A' )
     INSERT [TB] ( [ID] , [ColCode] , [ColName] , [ColType] ) VALUES ( 4 , '4' , '第四' , 'A' )
     INSERT [TB] ( [ID] , [ColCode] , [ColName] , [ColType] ) VALUES ( 5 , '5' , '第五' , 'A' )
     INSERT [TB] ( [ID] , [ColCode] , [ColName] , [ColType] ) VALUES ( 6 , '1' , '字母A' , 'B' )
     INSERT [TB] ( [ID] , [ColCode] , [ColName] , [ColType] ) VALUES ( 7 , '3' , '字母B' , 'B' )
     INSERT [TB] ( [ID] , [ColCode] , [ColName] , [ColType] ) VALUES ( 8 , '5' , '字母C' , 'B' )
     INSERT [TB] ( [ID] , [ColCode] , [ColName] , [ColType] ) VALUES ( 9 , '6' , '字母D' , 'B' )
     INSERT [TB] ( [ID] , [ColCode] , [ColName] , [ColType] ) VALUES ( 10 , '7' , '字母E' , 'B' ) SET IDENTITY_INSERT [TB] OFF现在换成这种结构,TA中的Col要根据TB中ColType中的值为A进行替换,TA中的ColB要根据TB中的ColType中的值为B进行替换,原理同上,最好是ColType的值可以做为参数,多谢了
      

  6.   

    To 小梁(幸福,這麼遠,那麼甜...!)如果我的TA和TB表都有10万条的记录,用update TA set col = dbo.f_getstr(Col)就会很慢了,是不是这样的呢,还有没有效率更高的写法呢,多谢你了!
      

  7.   

    问题解决了,我对字典表开了张表,把where条件取得的值插入这张表中,然后从这张表中取值,直接用select来取值实在是太慢了!!!
      

  8.   

    多谢大家了,这几天比较忙,没有时间结贴,不知大家能不能帮我看看另外一个贴子呢,是不是就是没有办法解决呢,给个意见,多谢大家了http://topic.csdn.net/u/20080819/15/aff27874-193d-4ee4-b36d-c76292d2156e.html