노드 이름이 사이트마다 변경되는 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를 저장하는 방식이 구조화되어 있다면 이것은 매우 도움이 될 것입니다. 그러나 이것은 설립 된 시스템이며 지금은 변경할 수 없습니다.
팁을 주시면 감사하겠습니다. 고맙습니다!
큰 질문입니다. 게시 해 주셔서 감사 드리며, 나는 그 해답을 읽을 것을 고대합니다. –