我的表结构如下:
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,如果不存在的话,仍然保留,多谢了!
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,如果不存在的话,仍然保留,多谢了!
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 行受影响)
*/
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 行受影响)
*/
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
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的值可以做为参数,多谢了