Vorschläge: xQuery wo Filter Prädikat liefert unerwartete Ergebnisse

Ich habe die folgende XML, die über eine MSSQL database mit OPENXML mit einem Xquery Filter analysiert wird, um die richtigen Zeilen zu greifen. Leider scheint es nicht, die passenden Reihen zu packen, die mir den Kopf kratzt.

Mit dem folgenden XML möchte ich nur die einzelne E-Mail-Adresse insert, wo die Methode = "Einfügen" ist, und ignoriere die verbleibenden zwei Adressen, bei denen die Methode nicht vorhanden ist oder einen anderen Wert hat (der zuvor eingefügt wurde).

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

Ich benutze diese sql-statement:

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

Es werden alle drei E-Mail-Adressen eingefügt, obwohl der erste und der letzte E-Mail-Knoten kein "methods" -Attribut haben. Wenn ich jedoch "Method =" DontAdd "auf die anderen zwei E-Mail-Adressen hinzufüge, wird nichts eingefügt .

Ich habe auch versucht, das Prädikat zu benutzen:

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

Das Ergebnis ist ähnlich – es fügt alle Zeilen ein und scheint die Tatsache zu ignorieren, dass zwei der Elemente von Email_Address kein Attribut haben. Methode = "Einfügen", unabhängig davon, ob das methodsattribut existiert.

Das Ziel ist es, die xml zu filtern, wie es zerrissen wird und füge nur die E-Mail-Adresse mit dem Attribut Method = "Insert" hinzu. Im Moment, was ich glaube, habe ich eigentlich "Wenn du method = 'Insert' in der datamenge findest, füge alle Zeilen" vs. "ein, wenn du method = 'insert' findest, nur die Zeilen insert, die dieses Attribut haben."

Vielen Dank im Voraus.

Bitte beachten Sie die folgende Antwort für diejenigen, die in Zukunft geholfen werden könnten. Nach dem Abrufen der Spalte 'Methode' in der z aliased Abfrage konnte ich standard t-sql verwenden, um die Ergebnisse korrekt zu filtern und dann die richtigen Zeilen einzufügen.

 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'