2014-01-22 2 views
1

xml 노드 및 값으로 채워진 varchar (max) 유형의 열이 있습니다. 예를 들어 열 데이터는 <tag1> <tag2>value1</tag2><tag3>value2</tag3>... </tag1>으로 시작됩니다. 이 문자열에서 벗어날 필요가있는 것은 정적 SQL 또는 저장 프로 시저를 사용하는 테이블의 모든 행에 대해 하나의 셀 내에서 "value1 value2 value3 ... valueN"입니다. 노드 트리가 항상 동일하지는 않지만 때때로 경로는 <tagX><tagY>valueY</tagY>...</tagX>입니다.여러 xml 하위 노드 값 검색

XML을 파쇄 한 경험은 모두 특정 값, 속성 또는 태그를 가져 오는 데 사용되며 모든 값이 아니라 열과 행 수를 유지하는 데 사용됩니다. 현재 쿼리 결과가 제품의 끝에서 반복되고 모든 것이 파쇄되지만 최근 변경으로 인해 더 이상 옵션이 아닙니다.

열을 xml 유형으로 변경할 수는 있지만 가능하면 그렇게하지 않으려합니다.

+0

당신은 어떤 데이터를 표시 할 수 있으며, 지금까지 무엇을 시도했다 ??? –

+0

PCI이므로 데이터를 표시 할 수 없습니다. xml 변수를 선언하고 열 데이터 (문자열 '<' and '>'이 포함되어있는 동안 루프 및 파쇄하려는 의도로)를 설정하려고 시도했지만 열의 모든 행에서이 작업을 수행해야하기 때문에 여러 값이 저장되어 있습니다. 나는 modify()를 고려해 봤지만 노드 경로의 변수 특성으로 인해 set path를 제공해야하고 delete가 값을 보존하지 않아도되므로 delete 나 value가 작동하지 않습니다. xml에 대한 나의 경험은 상당히 제한되어 있으므로 다른 가능한 해결책을 알지 못합니다. –

답변

1

XML로 열을 캐스팅하거나 테이블에서 XML로 바꾸고 XML을 //*에 파쇄하여 테이블의 모든 노드를 가져옵니다. 그런 다음 for xml path을 사용하여 값을 다시 연결합니다.

select (
     select ' '+X.N.value('text()[1]', 'varchar(max)') 
     from (select cast(T.XMLCol as xml)) as T1(XMLCol) 
     cross apply T1.XMLCol.nodes('//*') as X(N) 
     for xml path(''), type 
     ).value('substring(text()[1], 2)', 'varchar(max)') 
from T 

SQL Fiddle

+0

그 트릭을 했어, 고마워! –