Import von XML in SQL server mit OPENXML Befehl mit XMLNS

Ich habe den folgenden Code, um eine XML in SQL zu importieren

DECLARE @XML AS XML, @hDoc AS INT, @SQL NVARCHAR (MAX) SELECT @XML = XMLData FROM XMLwithOpenXML EXEC sp_xml_preparedocument @hDoc OUTPUT, @XML SELECT rid, uid FROM OPENXML(@hDoc, '/PportTimetable/Journey') WITH ( rid [varchar](50) '@rid', uid [varchar](100) '@uid' ) EXEC sp_xml_removedocument @hDoc GO 

Ich kann den Code zu arbeiten, aber nur, wenn es nicht enthält die xmlns Informationen wie unten gesehen, warum ist dies?

xmlns: xsd = "http://www.w3.org/2001/XMLSchema"

xmlns: xsi = "http://www.w3.org/2001/XMLSchema-instance"

xmlns = "http://www.thalesgroup.com/rtti/XmlTimetable/v8"

XML-Header

 <PportTimetable xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" timetableID="20161018020822" xmlns="http://www.thalesgroup.com/rtti/XmlTimetable/v8"> <Journey rid="201610188012733" uid="P12733" trainId="2J27" ssd="2016-10-18" toc="AW"> </Journey> </PportTimetable> 

Solutions Collecting From Web of "Import von XML in SQL server mit OPENXML Befehl mit XMLNS"

Ich würde empfehlen, das OPENXML Zeug ganz zu überspringen und die integrierte, native XQuery-Unterstützung in SQL server zu verwenden:

 declare @input XML = '<PportTimetable xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" timetableID="20161018020822" xmlns="http://www.thalesgroup.com/rtti/XmlTimetable/v8"> <Journey rid="201610188012733" uid="P12733" trainId="2J27" ssd="2016-10-18" toc="AW"> </Journey> </PportTimetable>' -- define your XML namespaces - here, there's only a single "default" namespace ;WITH XMLNAMESPACES(DEFAULT 'http://www.thalesgroup.com/rtti/XmlTimetable/v8') SELECT RID = XC.value('@rid', 'varchar(50)'), UID = XC.value('@uid', 'varchar(20)'), TrainId = XC.value('@trainId', 'varchar(25)'), SSD = XC.value('@ssd', 'varchar(25)'), TOC = XC.value('@toc', 'varchar(20)') FROM @input.nodes('/PportTimetable/Journey') AS XT(XC) 

Benutze die XQuery .nodes() -function, um dein XML in eine "Inline" -Tabelle von XML-Fragmenten zu .value() eine für jeden <Journey> -Knoten in diesem Beispiel) und dann die function .value() , um das Individuum zu greifen Elemente und Attribute aus diesen XML-Fragmenten eins nach dem anderen.

Sie müssen den Namespace als drittes Argument von sp_xml_preparedocument angeben

 DECLARE @XML AS XML='<PportTimetable xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" timetableID="20161018020822" xmlns="http://www.thalesgroup.com/rtti/XmlTimetable/v8"> <Journey rid="201610188012733" uid="P12733" trainId="2J27" ssd="2016-10-18" toc="AW"> </Journey> </PportTimetable>'; DECLARE @hDoc AS INT, @SQL NVARCHAR (MAX); EXEC sp_xml_preparedocument @hDoc OUTPUT, @XML,'<PportTimetable xmlns:b="http://www.thalesgroup.com/rtti/XmlTimetable/v8"/>'; SELECT rid, uid FROM OPENXML(@hDoc, '/b:PportTimetable/b:Journey') WITH ( rid [varchar](50) '@rid', uid [varchar](100) '@uid' ) EXEC sp_xml_removedocument @hDoc GO