2017-03-06 33 views
0

我有一个名为empl_type_multi的列,它只是逗号分隔的列,每个值都是指向另一个称为自定义标题的表的链接。TSQL,在逗号分隔列上更改值

例如,我可能有以下作为empl_type_multi值:

123, RHN, 458 

然后在custom_captions表这些是单个值:

123 = Dog 
RHN = Cat 
458 = Rabbit 

所有这些领域都是NTEXT。

什么,我试图做的是转换empl_type_multi列,在上面的例子中它有机会在custom_captions表中各自的名称,所以:

123, RHN, 458 

将成为

Dog, Cat, Rabbit 

任何对此的帮助将不胜感激。

-----编辑---------------------------------------- --------------------------

好吧,所以我设法将这些值转换为相应的标题,并将它们全部放到临时表中,以下是从CTE查询的输出放在桌子上:

ID1  ID2  fName lName Caption_name  Row_Number 
10007 22841 fname1 lname1 DENTAL ASSISTANT 1 
10007 22841 fname1 lname1      2 
10007 22841 fname1 lname1      3 
10008 23079 fname2 lname2 OPS WARD   1 
10008 23079 fname2 lname2 DENTAL    2 
10008 23079 fname2 lname2      3 

使下标题名称,也被添加到用逗号分隔ROW_NUMBER 1的标题名称我怎么能更新吗?

如果我能做到这一切,我需要做的就是删除所有记录ROW_NUMBER!= 1

------编辑--------------- -----------------------------------

第一次编辑的解决方案是:

WITH CTE AS 
(
    SELECT 
     p.ID1 
     , p.ID2 
     , p.fname 
     , p.lname 
     , p.caption_name-- 
     , ROW_NUMBER() OVER (PARTITION BY p.id1ORDER BY caption_name DESC) AS RN 
    FROM tmp_cs p 
) 
UPDATE tblPerson SET empType = empType + ', ' + c.Data 
FROM CTE c WHERE [DB1].dbo.tblPerson.personID = c.personID AND RN = 2 

然后我只是递增RN = 2,直到我得到0行受影响。

这之后,我跑:

DELETE FROM CTE WHERE RN != 1 AND Caption_name = '' 
+4

这听起来像循环容易构建CAPTION_NAME串你需要规范你的数据结构。 – artm

+0

这不是我的数据库,我被给了它,并被告知将这些数据导出到Excel电子表格中。 –

回答

1
select ID1, ID2, fname, lname, left(captions, len(captions) - 1) as captions 
from (
    select distinct ID1, ID2, cast(fname as nvarchar) as fname, cast(lname as nvarchar) as lname, (
     select cast(t1.caption_name as nvarchar) + ',' 
     from #temp as t1 
     where t1.ID1 = t2.ID1 
     and t1.ID2 = t2.ID2 
     and cast(caption_name as nvarchar) != '' 
     order by t1.[row_number] 
     for xml path ('')) captions 
    from #temp as t2 
) yay_concatenated_rows 

这会给你想要的东西。你会看到从ntext转换为varchar。这是比较必要的,因为许多逻辑运算符不能在ntext上执行。它可以隐式地退回另一种方式,所以不用担心。请注意,投射时我没有指定长度;这将默认为30,因此根据需要调整为varchar(length)以避免截断。我还假设ID1和ID2形成一个组合键(看起来如此)。根据您需要的关系调整连接。

+0

嗨,感谢您的回应,我在我看到这篇文章之前就想出了一个不那么优雅的方法,它在上面的编辑中。 –

1

你刚刚分享了你的问题,而不是确切的问题。

试试这个,

DECLARE @T TABLE(ID1 VARCHAR(50),ID2 VARCHAR(50),fName VARCHAR(50),LName VARCHAR(50),Caption_name VARCHAR(50),Row_Number INT) 
INSERT INTO @T VALUES 
(10007,22841,'fname1','lname1','DENTAL ASSISTANT', 1) 
,(10007,22841,'fname1','lname1', NULL,     2) 
,(10007,22841,'fname1','lname1', NULL,     3) 
,(10008,23079,'fname2','lname2','OPS WARD',   1) 
,(10008,23079,'fname2','lname2','DENTAL',    2) 
,(10008,23079,'fname2','lname2', NULL,     3) 

SELECT * 
,STUFF((SELECT ','+Caption_name 
FROM @T T1 WHERE T.ID1=T1.ID1 FOR XML PATH('') 
),1,1,'') 
FROM @T T 
1

您可以通过while循环

declare @i int = 2,@Caption_name varchar(100)= (select series from 
#temp where Row_Number= 1) 
while @i <= (select count(*) from #temp) 
begin 
select @Caption_name = @Caption_name + Caption_name from #temp where Row_Number = @i) 
set @i = @i+1 
end 
update #temp set Caption_name = @Caption_name where Row_Number = 1 

和使用案例语句删除空值

(select case when isnull(Caption_name ,'') = '' then 
'' else ',' + Caption_name end