SQL server Grabbing Wert aus XML-Parameter in späterer Abfrage verwenden

Ich bin wirklich neu in SQL server und gespeicherte Prozeduren zu beginnen. Ich muss in der Lage sein, eine eingehende XML-file für einen bestimmten Element Wert zu parsing und zu vergleichen / speichern Sie es später in der Prozedur.

Ich habe ein paar Sachen gegen mich gestapelt. Eines der Elemente, das ich brauche, ist tief in dem Dokument begraben. Ich habe kein Glück bei der search nach dem Namen mit methods ähnlich wie dies:

select CurrentBOD = c.value('(local-name(.))[1]', 'VARCHAR(MAX)'), c.value('(.)[1]', 'VARCHAR(MAX)') from @xml.nodes('PutMessage/payload/content/AcknowledgePartsOrder/ApplicationArea/BODId') as BODtable(c) 

Es kommt immer null zurück.

Also versuche ich etwas ähnliches:

  declare @BODtable TABLE(FieldName VARCHAR(MAX), FieldValue VARCHAR(MAX)) SELECT FieldName = nodes.value('local-name(.)', 'varchar(50)'), FieldValue = nodes.value('(.)[1]', 'varchar(50)') FROM @xml.nodes('//*') AS BODtable(nodes) declare @CurrentBOD VARCHAR(36) set @CurrentBOD = '' SET @CurrentBOD = (SELECT FieldValue from @BODtable WHERE FieldName = 'BODId') 

Dies gibt mir die list der Knotennamen und Werte korrekt (ich teste dies in einer Abfrage und BODtable hat alle Elemente mit den richtigen Werten aufgelistet), aber wenn ich @CurrentBOD setze, kommt es null.

Bin ich fehlt ein einfacher path, dies zu tun? Bin ich diese beiden Ansätze irgendwie durcheinander?

Hier ist ein Teil der xml Ich bin als reference parsing:

 <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:wsa="http://schemas.xmlsoap.org/ws/2004/03/addressing" xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity- secext-1.0.xsd" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401- wss-wssecurity-utility-1.0.xsd"> <soap:Header> <payloadManifest xmlns="???"> <c contentID="Content0" namespaceURI="???" element="AcknowledgePartsOrder" version="4.0" /> </payloadManifest> <wsa:Action>http://www.starstandards.org/webservices/2005/10/transport/operations/PutMessage</wsa:Action> <wsa:MessageID>uuid:df8c66af-f364-4b8f-81d8-06150da14428</wsa:MessageID> <wsa:ReplyTo> <wsa:Address>http://schemas.xmlsoap.org/ws/2004/03/addressing/role/anonymous</wsa:Address> </wsa:ReplyTo> <wsa:To>???</wsa:To> <wsse:Security soap:mustUnderstand="1"> <wsu:Timestamp wsu:Id="Timestamp-bd91e76f-c212-4555-9b23-f66f839672bd"> <wsu:Created>2013-01-03T21:52:48Z</wsu:Created> <wsu:Expires>2013-01-03T21:53:48Z</wsu:Expires> </wsu:Timestamp> <wsse:UsernameToken xmlns:wsu="???" wsu:Id="???"> <wsse:Username>???</wsse:Username> <wsse:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText">???</wsse:Password> <wsse:Nonce>???</wsse:Nonce> <wsu:Created>2013-01-03T21:52:48Z</wsu:Created> </wsse:UsernameToken> </wsse:Security> </soap:Header> <soap:Body> <PutMessage xmlns="??????"> <payload> <content id="???"> <AcknowledgePartsOrder xmlns="???" xmlns:xsi="???" xsi:schemaLocation="??? ???" revision="???" release="???" environment="???n" lang="en-US" bodVersion="???"> <ApplicationArea> <Sender> <Component>???</Component> <Task>???</Task> <ReferenceId>???</ReferenceId> <CreatorNameCode>???</CreatorNameCode> <SenderNameCode>???</SenderNameCode> <DealerNumber>???</DealerNumber> <PartyId>???</PartyId> <LocationId /> <ServiceId /> </Sender> <CreationDateTime>2013-01-03T21:52:47</CreationDateTime> <BODId>71498800-c098-4885-9ddc-f58aae0e5e1a</BODId> <Destination> <DestinationNameCode>???</DestinationNameCode> 

Solutions Collecting From Web of "SQL server Grabbing Wert aus XML-Parameter in späterer Abfrage verwenden"

Sie müssen die XML-Namespaces respektieren !

Zuerst ist Ihr Ziel-XML-Knoten <BODId> innerhalb der <BODId> <soap:Envelope> und <soap:Body> -Tags – beide müssen in Ihre Auswahl aufgenommen werden.

Zweitens <PutMessage> sowohl die <PutMessage> als auch die <AcknowledgePartsOrder> <PutMessage> standardmäßig XML-Namespaces (die xmlns=.... ohne Präfix) zu haben – und diese müssen respektiert werden, wenn Sie Ihre data mit XPath auswählen.

Angenommen, dass <PutMessage xmlns="urn:pm"> und <AcknowledgePartsOrder xmlns="urn:apo"> (das sind nur Vermutungen auf meinem Teil – replace Sie durch die tatsächlichen XML-Namespaces, die Sie hier nicht gezeigt haben), Sie sollte in der Lage sein, diesen XPath zu benutzen, um zu bekommen was du suchst:

 ;WITH XMLNAMESPACES('http://schemas.xmlsoap.org/soap/envelope/' AS soap, 'urn:pm' AS ns, 'urn:apo' AS apo) SELECT XC.value('(apo:BODId)[1]', 'varchar(100)') FROM @YourXmlVariable.nodes('/soap:Envelope/soap:Body/ns:PutMessage/ns:payload/ns:content/apo:AcknowledgePartsOrder/apo:ApplicationArea') AS XT(XC) 

Dies gibt den erwarteten Wert ( 71498800-c098-4885-9ddc-f58aae0e5e1a ) in meinem Fall.