建议:xQuery过滤谓词可以提供意外结果

时间:2017-02-10 21:58:44

标签: sql-server xpath xquery openxml xquery-sql

我有以下xml,它通过MSSQL数据库解析,使用OPENXML和xquery过滤器来获取正确的行。不幸的是,它似乎没有抓住适当的行,这让我摸不着头脑。

使用以下XML,我只想插入Method =“Insert”的单个电子邮件地址,并忽略其中两个不存在Method或其他值(先前已插入)的地址。

<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="jones@company.com" />
            <Entity_Email ID="0" EmailAddress="smith@company.com" 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="individual@test.com"/>
               </Entity_Emails>
            </Entity_Contact>
         </Entity_Contacts>
      <Entity_Business>
   </Entity_Businesses>
</Entities>

我正在使用这个sql语句:

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';

按原样,即使第一个和最后一个电子邮件节点没有“方法”属性,也会插入所有三个电子邮件地址。但是,如果我将'Method =“DontAdd”'添加到其他两个电子邮件地址,什么都没有插入。

我也尝试过使用谓词:

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

结果类似 - 它插入所有行,并且似乎忽略了两个Email_Address元素没有属性Method =“Insert”的事实,无论Method属性是否存在。

目标是在粉碎时过滤xml,只添加具有Method =“Insert”属性的电子邮件地址。现在我相信我拥有的实际上是“如果你在数据集中找到Method ='Insert',插入所有行”vs“如果找到method ='insert',只插入那些具有该属性的行。”

提前谢谢。

1 个答案:

答案 0 :(得分:0)

请注意以下可能有帮助的答案。检索列&#39;方法&#39;在z别名查询中,我能够使用标准t-sql正确过滤结果,然后插入正确的行。

import _ from 'lodash'