2017-02-10 1 views
0

xquery 필터를 사용하여 OPENXML을 사용하여 MSSQL 데이터베이스를 통해 구문 분석되는 다음 xml이 있는데 올바른 행을 가져옵니다. 불행히도 적절한 행을 잡지 않는 것 같아서 머리가 긁히는 경우가 있습니다.제안 : 필터 조건부가 예기치 않은 결과를 제공하는 xQuery

다음 XML을 사용하면 Method가 "Insert"인 단일 전자 메일 주소를 삽입하고 Method가없는 나머지 두 주소는 무시하거나 이전에 삽입 된 다른 값만 사용하려고합니다. 나는이 SQL 문을 사용하고

<Entities xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" ActiveEntityID="0"> 
    <Entity_Businesses> 
     <Entity_Business EntityTypeID="5" EntityRoleTypeID="9" Method="Update" Name="test business 76" EIN="" EmployeeCount="75" TotalAssets="750000.00"> 
     <Entity_Emails> 
      <Entity_Email ID="85" EmailAddress="[email protected]" /> 
      <Entity_Email ID="0" EmailAddress="[email protected]" Method="Insert"/> 
     </Entity_Emails> 
     <Entity_Contacts> 
      <Entity_Contact ID="162" EntityTypeID="4" EntityRoleTypeID="9" FName="Joe" MName="k" LName="Smith" SSN="444-44-444" JobTitleID="0" DOB="2007-02-27T00:00:00"> 
       <Entity_Emails> 
        <Entity_Email ID="86" EmailAddress="[email protected]"/> 
       </Entity_Emails> 
      </Entity_Contact> 
     </Entity_Contacts> 
     <Entity_Business> 
    </Entity_Businesses> 
</Entities> 

: 첫 번째와 마지막 이메일 노드는 '방법'속성이없는 경우에도

, 세 개의 이메일 주소가 삽입되기 그대로
INSERT into Entity_Email(bsCol, EmailAddress, xmlID, xmlPID) 
SELECT DENSE_RANK() OVER(ORDER BY y.parentid) AS elementid, z.EmailAddress, y.parentid, z.ID 
FROM OPENXML(@hDoc, '//Entity_Emails', 1) 
WITH (parentid int '@mp:parentid', id int '@mp:id') y 
INNER JOIN OPENXML(@hDoc, N'//Entity_Emails/Entity_Email',1) WITH (EmailAddress nvarchar(100), xmlID int '@mp:id', parentid int '@mp:parentid') as z 
ON y.id = z.parentid 
WHERE @pRI.value('(//Entity_Emails/Entity_Email/@Method)[1]','nvarchar(50)') = 'Insert'; 

. 나는 '방법은 "DontAdd가"='다른 두 개의 이메일 주소로, 아무것도 삽입하지됩니다 추가 그러나 경우

나는 또한 술어를 사용하여 시도했다

:.

WHERE @pRI.exist('//Entity_Emails/Entity_Email[@Method="Insert"]') =1; 

결과가 비슷합니다. 모든 행을 삽입하며 Method 속성의 존재 여부와 상관없이 두 개의 Email_Address 요소에 Method = "Insert"속성이 없다는 사실을 무시하는 것처럼 보입니다.

목표는 XML이 파쇄됨에 따라 필터링하고 Method = "Insert"속성이있는 이메일 주소 만 추가하는 것입니다. 지금 내가 가진 믿을만한 사실은 "만약 당신이 데이터 집합에 Method = 'Insert'를 발견하면, 모든 행을 삽입하라."method = 'insert'를 찾으면 그 속성을 가진 행만 삽입하면된다.

미리 감사드립니다.

답변

0

향후 도움이 될 수있는 답변은 다음과 같습니다. 별칭이 지정된 쿼리에서 '메서드'열을 검색 한 후 표준 t-sql을 사용하여 결과를 올바르게 필터링 한 다음 올바른 행을 삽입 할 수있었습니다.

INSERT into Entity_Email(bsCol, EmailAddress, xmlID, xmlPID) 
    SELECT DENSE_RANK() OVER(ORDER BY y.parentid) AS elementid, z.EmailAddress, z.xmlID, y.parentid 
    FROM OPENXML(@hDoc, '//Entity_Emails', 1) 
    WITH (parentid int '@mp:parentid', id int '@mp:id') y 
    INNER JOIN OPENXML(@hDoc, N'//Entity_Emails/Entity_Email',1) WITH (EmailAddress nvarchar(100), xmlID int '@mp:id', parentid int '@mp:parentid', Method nvarchar(50) '@Method') as z 
    ON y.id = z.parentid 
    WHERE z.Method = 'Insert' 
관련 문제