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'를 찾으면 그 속성을 가진 행만 삽입하면된다.
미리 감사드립니다.