建议:xQuery,其中筛选器谓词传递意外结果



我有下面的xml,它正在通过MSSQL数据库使用带xquery过滤器的OPENXML进行解析,以获取正确的行。不幸的是,它似乎没有抓住合适的行,这让我挠头。

使用以下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"属性,也会插入所有三个电子邮件地址。但是,如果我在其他两个电子邮件地址中添加"Method="DontAdd",则不会插入任何内容。

我也尝试过使用谓词:

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

结果是相似的——它插入了所有行,并且似乎忽略了这样一个事实,即无论Method属性是否存在,Email_Address元素中的两个都没有Method="Insert"属性。

目标是在xml被分解时对其进行过滤,并且只添加具有属性Method="Insert"的电子邮件地址。现在,我相信我实际上是"如果你在数据集中找到Method='Insert',插入所有行"与"如果你找到Method='Insert',只插入那些具有该属性的行。">

提前谢谢。

请注意以下答案,以备将来使用。在z别名查询中检索列"Method"后,我能够使用标准的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'

最新更新