2011-05-02 5 views
2

그래서 나는 다음과 같은 테이블이 있습니다
302 | /302.jpgT의 SQL - Conconate 열 여러 번

ID | Product_Image
300 | /300-01.jpg
300 | /300-02.jpg
301 | /301.jpg는 ID 당 이미지 무제한이있을 수 있습니다. 나는 하나 개의 컬럼에 모든 이미지 참조를 연결할 필요가 있고, 나는 다음과 같은 출력을 생성하는 데 문제가 있어요 :

ID | Product Images
300 | /300-01.jpg; /300-02.jpg;
301 | /301.jpg;

답변

3
-- cte with test data 
;with T (ID, Product_Image) as 
(
select 300, '/300-01.jpg' union all 
select 300, '/300-02.jpg' union all 
select 301, '/301.jpg' union all 
select 302, '/302.jpg' 
) 

select 
    T.ID, 
    (select T2.Product_Image+'; ' 
    from T as T2 
    where T.ID = T2.ID 
    for xml path(''), type).value('.[1]', 'nvarchar(max)') as Product_Images 
from T 
group by T.ID 

결과 :

ID Product_Images 
---- ------------------------- 
300 /300-01.jpg; /300-02.jpg; 
301 /301.jpg; 
302 /302.jpg; 
+0

이됩니까을 연결 전후에 던지기? 이후이면 문자열이 이미 8k/4k로 잘릴 수 있습니다. – gbn

+1

@gbn - 자르지 않습니다. 이것을 이해하면 중첩 된 select의 결과는 단 하나의 값만 가진 XML 데이터 유형이며 태그가 없어도 루트 태그조차 없다는 것입니다. 오히려 잘못된 XML. .value ('. [1]', 'nvarchar (max)' '는 XML의 유일한 값을'nvarchar (max)'로 가져옵니다. 유효한 xml을 얻기 위해'root ('r ')' ' ...'의 단일 값을 얻으려면'.value ('r [1]', nvarchar (max)'를 사용하십시오 .. –

+0

XML PATH는 varchar가 아닌 XML을 제공하므로 절사가 발생하지 않습니다. . Ta. 나는 CROSS APPLY와 CAST를 사용 했었습니다. 성능 차이를 확인할 수 있는지 확인합니다. – gbn