2013-06-12 2 views
2

노드 이름이 사이트마다 변경되는 xml 열이 있습니다 (기본적으로 사용자가 표준 필드 외에 사용자 정의 필드를 만들 수 있습니다. 제공하고,이 분야는 내가 언급 한 XML 컬럼에 보관됩니다. 샘플 셀이 보이는 노드 UnitNumber 및 AptNo 완전히 고객 특정 것을SQL 서버에서 노드가 동적 인 xml 열을 파쇄하고 쿼리하는 방법

<Dictionary><UnitNumber>56</UnitNumber><AptNo>12</AptNo></Dictionary> 

주와 같은, 그것은 AutoBrand 및 ManifestNo 및 TravelSite 수 있습니다.

이제 고객은이 필드에 대해 쿼리 할 수 ​​있습니다. 저장된 proc는 xml 매개 변수를 가져오고 해당 xml 매개 변수를 구문 분석합니다. 이

field   value 
-----   ----- 
UnitNumber  56 
AptNo   12 

그래서이 테이블은 고객이 절 곳으로 전달 무엇을 같은 임시 테이블 NTO, 테이블이 보인다 (번역되어야한다 t에서 * 선택하는 경우 UnitNumber = 56 AptNo = 12)

그런 다음 결과가 나올 테이블에서 xml 열을 파쇄합니다. nodes() 함수와 OUTER APPLY를 사용하기 때문에 마지막 CTE에는 노드가 두 개 이상 있기 때문에 중복 된 일부 ID가 있습니다. 우리가 임시 테이블 CTE에 가입 할 때 그래서

CustomFieldName  CustomFieldValue  EntityId 
---------------  ----------------  ---------- 
UnitNumber    56      1 
AptNo     12      1 
UnitNumber    56      2 

뭔가를 반환

SELECT T.C.value('local-name(.)', 'nvarchar(100)') as CustomFieldName, 
T.C.value('.', 'nvarchar(100)') as CustomFieldValue, 
#tempTable.* 
FROM #tempTable 
OUTER APPLY #tempTable.CustomFields.nodes('/Dictionary/child::*') as T(C) 

다음과 같이 우리가 XML을 분쇄 할

는 SQL 문이 뭔가, 우리는

에 가입
CustomFieldName = field and CustomFieldValue = value 

쿼리에서 entityId 1과 entityId 2를 모두 반환하지만 반환 만하려고합니다. entityId 1은 두 조건을 모두 만족하는 유일한 엔터티이므로

(UnitNumber = 56 AND AptNo = 12) 

이 작업을 수행하는 방법을 찾지 못했습니다. 물론 우리가 CustomFields를 저장하는 방식이 구조화되어 있다면 이것은 매우 도움이 될 것입니다. 그러나 이것은 설립 된 시스템이며 지금은 변경할 수 없습니다.

팁을 주시면 감사하겠습니다. 고맙습니다!

+0

큰 질문입니다. 게시 해 주셔서 감사 드리며, 나는 그 해답을 읽을 것을 고대합니다. –

답변

0

이와 비슷한 것으로 나을 수 있습니다. 내 머리 꼭대기에서 :

Select top 1 EntityId from #cte 
left join #tempTable 
on CustomFieldName = field 
and CustomFieldValue = value 
group by EntityId 
order by count(entityid) desc 
+0

여전히 stackoverflow의 규칙을 사용하는 방법을 알아 내려고했지만 답변에 감사드립니다. 그것은 매우 도움이되었습니다. – freud

0

내가 가까이 왔어. 다음은 내가 끝낸 일입니다.

감사합니다.

관련 문제