2017-03-03 23 views
2

我得到一个表类型变量这样从表类型变量

color 
------------- 
Black 
Blue<br/>PMS 285C 
Green<br/>PMS 360 
Red<br/>PMS 199 

删除列的一些角色我要让他们像

color 
------------- 
Black, Blue, Green, Red 

,但我有一个非常困难的时期删除“& lt ..”的东西。 我也跟着这样的回答:Is there a way to loop through a table variable in TSQL without using a cursor? 要创建一个临时表中循环,并删除字符,但仍然无法正常工作

DECLARE @result int, @i int = 0, @colors varchar(800); 
DECLARE @results table(color varchar(40)); 
INSERT INTO @results SELECT color FROM... 

DECLARE @temp table(Id INT, color varchar(40)); 
INSERT INTO @temp SELECT ROW_NUMBER() OVER (ORDER BY (SELECT 1)) AS Id, color FROM @results 

WHILE (SELECT Count(*) FROM @temp WHERE color like '%&lt%') > 0 
BEGIN 
    SELECT Top 1 @i = Id FROM @temp WHERE color like '%&lt%' 
    UPDATE @temp Set color = (case when color like '%&lt%' 
         then left(color, charindex('&lt', color) - 1) 
         else color 
        end) Where Id = @i 
    Delete @temp Where Id = @i 
END 

我仍然得到

color 
------------------------------------------------------------------------------ 
Black, Blue<br/>PMS 285C, Green<br/>PMS 360, Red<br/>PMS 199 

谁能帮帮我好吗?或者提出一些建议。

感谢

回答

0

这使用left()charindex()&之前得到每个值 的左侧部分;并使用stuff() with select ... for xml path ('') method of string concatenation

select stuff((
    select ', '+left(color,charindex('&',color+'&')-1) 
    from @temp 
    for xml path (''), type).value('.','varchar(max)') 
    ,1,2,'') 

测试设置:

create table temp (color varchar(32)) 
insert into temp values 
('Black') 
,('Blue<br/>PMS 285C') 
,('Green<br/>PMS 360') 
,('Red<br/>PMS 199') 

select stuff((
    select ', '+left(color,charindex('&',color+'&')-1) 
    from temp 
    for xml path (''), type).value('.','varchar(max)') 
    ,1,2,'') 

回报:Black, Blue, Green, Red

rextester演示:http://rextester.com/TWESQZ38491

参考:

+1

请解释它是如何工作的 – Horaciux

0

在前面的回答另一个版本的基础

create table temp (color varchar(32)) 
    insert into temp values 
    ('Black') 
    ,('Blue<br/>PMS 285C') 
    ,('Green<br/>PMS 360') 
    ,('Red<br/>PMS 199') 



    declare @var varchar(max) 
    set @var='' 
    select @[email protected]+case when charindex('&',color)=0 then color 
     else left(color, charindex('&',color)-1) end +', ' from temp 
    select left(@var, len(@var)-1)