Sql server OpenXML无法使用名称空间,可能是原始XML文件问题?
我在将工厂机器生成的XML文件导入SQL表时遇到问题。如果我编辑该文件以删除其他名称空间,我会得到正确的结果,但由于我们希望自动化这一过程,这是不可行的 XML文件的开头如下所示:Sql server OpenXML无法使用名称空间,可能是原始XML文件问题?,sql-server,xml,Sql Server,Xml,我在将工厂机器生成的XML文件导入SQL表时遇到问题。如果我编辑该文件以删除其他名称空间,我会得到正确的结果,但由于我们希望自动化这一过程,这是不可行的 XML文件的开头如下所示: <?xml version="1.0" encoding="UTF-8"?> <LaneHistory xmlns="omlNamespace" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="oml
<?xml version="1.0" encoding="UTF-8"?>
<LaneHistory xmlns="omlNamespace" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="omlNamespace C:\Program%20Files\Moba\Omnia%20MMI\MMI\bin\..\Application%20Data\XML\Schema\OML-LaneHistory.xsd">
<FileProperties>
<MachineNumber>33309</MachineNumber>
<CreationDateTime>2012-06-29T08:12:41</CreationDateTime>
<ContentDescription>LaneHistory</ContentDescription>
<Version>001</Version>
</FileProperties>
<Lane>
<General>
<StartDateTime>2012-06-29T05:50:02</StartDateTime>
<StopDateTime>2012-06-29T06:20:07</StopDateTime>
<LaneNumber>25</LaneNumber>
</General>
<Supply>
<Property>
<Name>Jones Heulyn Org Hse 3</Name>
<AdditionalCode>UK20296=</AdditionalCode>
</Property>
<Identification>
<TraceCode1>UK20296=</TraceCode1>
<TraceCode2>633264</TraceCode2>
在我看来,您的命名空间格式不正确:
set @rootxmlns = '<LaneHistory xmlns="omlNamespace" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="omlNamespace C:\Program%20Files\Moba\Omnia%20MMI\MMI\bin\..\Application%20Data\XML\Schema\OML-LaneHistory.xsd">/'
set@rootxmlns='/'
结尾处的“/”和“>”顺序错误。我想你只需要这个:
set @rootxmlns = '<LaneHistory xmlns="omlNamespace" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="omlNamespace C:\Program%20Files\Moba\Omnia%20MMI\MMI\bin\..\Application%20Data\XML\Schema\OML-LaneHistory.xsd"/>'
set@rootxmlns=''
MSDN有一个示例XML命名空间:
'<ROOT xmlns:xyz="urn:MyNamespace"/>'
“”
…供参考
第2部分-所以查询不返回任何内容,我认为这是因为在使用OPENXML查询XML时设置了以属性为中心的选项(1)。如果您将其更改为以元素为中心的选项(2),那么它应该可以工作吗?我对您的部分XML做了一个小测试,通过将选项从1更改为2,可以弹出机器编号 基本上,这是以属性为中心的XML:
<LaneHistory><FileProperties MachineNumber="33309"/></LaneHistory>
…这是以元素为中心的XML
<LaneHistory><FileProperties><MachineNumber>33309</MachineNumber></FileProperties></LaneHistory>
33309
因此,需要明确的是,您的OPENXML语句需要第三个参数,应该是2。我终于解决了这个问题,我不得不将代码更改为以下内容:
DECLARE @XML AS XML, @hDoc AS INT, @SQL NVARCHAR (MAX), @rootxmlns varchar(MAX)
SELECT @XML = XMLData FROM XMLwithOpenXML
set @rootxmlns = '<LaneHistory xmlns="omlNamespace" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="omlNamespace C:\Program%20Files\Moba\Omnia%20MMI\MMI\bin\..\Application%20Data\XML\Schema\OML-LaneHistory.xsd">/'
EXEC sp_xml_preparedocument @hDoc OUTPUT, @XML, @rootxmlns
EXEC sp_xml_preparedocument @hDoc OUTPUT, @XML,N'<root xmlns:n="omlNamespace" />'
insert into lanehistory
SELECT * FROM OPENXML (@hDoc,'/n:LaneHistory/n:Lane/n:Results/n:ResultPerGrade/n:WeightLimit', 2)
WITH
(
MachineNumber [varchar](7) '../../../../n:FileProperties/n:MachineNumber',
StartDateTime [varchar](25) '../../../n:General/n:StartDateTime',
StopDateTime [varchar](125) '../../../n:General/n:StopDateTime',
LaneNumber [varchar](6) '../../../n:General/n:LaneNumber',
ExternalIdentification [varchar](30) '../../../n:Supply/n:ExternalIdentification/n:ID1',
FlkName [varchar](30) '../../../n:Supply/n:Property/n:Name',
FlkNumber [varchar](10) '../../../n:Supply/n:Identification/n:TraceCode2',
UKCode [varchar](10) '../../../n:Supply/n:Identification/n:TraceCode1',
ProductName [VarChar](30) '../../../n:Product/n:Property/n:Name',
PRoductType [VarChar](30) '../../../n:Product/n:Property/n:Type',
Package [VarChar](30) '../../../n:Product/n:Property/n:PackageName',
EggsPerLane [varchar](6) '../n:Count',
EggsGraded [FLOAT] '../../../n:Supply/n:Operation/n:AmountOfEggs',
EDescription [VarChar](30) '../n:Description',
EWeight [VarChar](30) '../n:Weight',
MinWeight [VarChar](30) '../n:WeightLimit/n:MinWeight',
MaxWeight [VarChar](30) '../n:WeightLimit/n:MaxWeight',
ExtraInfo1 [VarChar](20) '../../../n:Supply/n:Extra/n:Info1',
ExtraInfo2 [VarChar](20) '../../../n:Supply/n:Extra/n:Info2',
ExtraInfo3 [VarChar](20) '../../../n:Supply/n:Extra/n:Info3',
ExtraInfo4 [VarChar](20) '../../../n:Supply/n:Extra/n:Info4',
ExtraInfo5 [VarChar](20) '../../../n:Supply/n:Extra/n:Info5',
ShedNo [VarChar](6) '../../../n:Supply/n:Egg/n:ShedNumber',
ShedType [VarChar](30) '../../../n:Supply/n:Egg/n:Type',
LayDate [VarChar](12) '../../../n:Supply/n:Dates/n:LayDate',
SupplyDate [VarChar](12) '../../../n:Supply/n:Dates/n:SupplyDate',
BestBefore [VarChar](12) '../../../n:Product/n:Dates/n:BestBeforeDate'
)
EXEC sp_xml_removedocument @hDoc
EXEC sp_xml_preparedocument@hDoc OUTPUT,@xml,N''
插入lanehistory
从OPENXML中选择*(@hDoc,'/n:LaneHistory/n:Lane/n:Results/n:ResultPerGrade/n:WeightLimit',2)
具有
(
MachineNumber[varchar](7)../../../../../../n:FileProperties/n:MachineNumber',
StartDateTime[varchar](25)../../../n:General/n:StartDateTime',
StopDateTime[varchar](125)../../../n:General/n:StopDateTime',
LaneNumber[varchar](6)../../../n:General/n:LaneNumber',
外部标识[varchar](30)../../n:Supply/n:ExternalIdentification/n:ID1',,
FlkName[varchar](30)../../../n:Supply/n:Property/n:Name',
FlkNumber[varchar](10)../../../n:Supply/n:Identification/n:TraceCode2',
UKCode[varchar](10)../../../n:Supply/n:Identification/n:TraceCode1',
ProductName[VarChar](30)../../../n:Product/n:Property/n:Name',
PRoductType[VarChar](30)../../../n:Product/n:Property/n:Type',
Package[VarChar](30)../../../n:Product/n:Property/n:PackageName',
EggsPerLane[varchar](6)…/n:Count',
EggsGraded[FLOAT]'../../n:Supply/n:Operation/n:AmountOfEggs',
e说明[VarChar](30)../n:Description',
EWeight[VarChar](30)../n:Weight',
最小重量[VarChar](30)../n:WeightLimit/n:MinWeight',
MaxWeight[VarChar](30)../n:WeightLimit/n:MaxWeight',
ExtraInfo1[VarChar](20)../../../n:Supply/n:Extra/n:Info1',
ExtraInfo2[VarChar](20)../../../n:Supply/n:Extra/n:Info2',
ExtraInfo3[VarChar](20)../../../n:Supply/n:Extra/n:Info3',
ExtraInfo4[VarChar](20)../../../n:Supply/n:Extra/n:Info4',
ExtraInfo5[VarChar](20)../../../n:Supply/n:Extra/n:Info5',
谢德诺[VarChar](6)“../../../n:Supply/n:Egg/n:ShedNumber”,
ShedType[VarChar](30)../../../n:Supply/n:Egg/n:Type',
装卸日期[VarChar](12)../../n:Supply/n:Dates/n:LayDate',
SupplyDate[VarChar](12)../../../n:Supply/n:Dates/n:SupplyDate',
BestBefore[VarChar](12)../../../n:Product/n:Dates/n:BestBeforeDate'
)
EXEC sp_xml_removedocument@hDoc
谢谢Richard,那一定是我在尝试不同的选择。使用/的正确顺序,我的脚本现在运行,但绝对没有返回任何结果:(我扩展了我的问题。我可以让它工作,但我不得不从您的示例中伪造一些XML,因为这显然是不完整的。我还删除了一些模式信息等(因为它似乎被设置了两次)因此,您可能会得到不同的结果?再次感谢Richard。我将与设备制造商讨论这一点。如果我将架构详细信息单独保留在原始XML文件中,则会失败,但如果我删除所有内容,则效果良好。您删除了架构的哪一部分?即使使用第三个openxml选项(2)除非编辑XML文件并将模式移回根目录(LaneHistory),否则无法获取任何数据.Yup,这就是我所做的;从XML中删除模式,但在解析时将其保留在命名空间中。此外,我只使用了您发布的部分XML,所以我只是正确地关闭了所有内容,并测试了单个属性。
EXEC sp_xml_preparedocument @hDoc OUTPUT, @XML,N'<root xmlns:n="omlNamespace" />'
insert into lanehistory
SELECT * FROM OPENXML (@hDoc,'/n:LaneHistory/n:Lane/n:Results/n:ResultPerGrade/n:WeightLimit', 2)
WITH
(
MachineNumber [varchar](7) '../../../../n:FileProperties/n:MachineNumber',
StartDateTime [varchar](25) '../../../n:General/n:StartDateTime',
StopDateTime [varchar](125) '../../../n:General/n:StopDateTime',
LaneNumber [varchar](6) '../../../n:General/n:LaneNumber',
ExternalIdentification [varchar](30) '../../../n:Supply/n:ExternalIdentification/n:ID1',
FlkName [varchar](30) '../../../n:Supply/n:Property/n:Name',
FlkNumber [varchar](10) '../../../n:Supply/n:Identification/n:TraceCode2',
UKCode [varchar](10) '../../../n:Supply/n:Identification/n:TraceCode1',
ProductName [VarChar](30) '../../../n:Product/n:Property/n:Name',
PRoductType [VarChar](30) '../../../n:Product/n:Property/n:Type',
Package [VarChar](30) '../../../n:Product/n:Property/n:PackageName',
EggsPerLane [varchar](6) '../n:Count',
EggsGraded [FLOAT] '../../../n:Supply/n:Operation/n:AmountOfEggs',
EDescription [VarChar](30) '../n:Description',
EWeight [VarChar](30) '../n:Weight',
MinWeight [VarChar](30) '../n:WeightLimit/n:MinWeight',
MaxWeight [VarChar](30) '../n:WeightLimit/n:MaxWeight',
ExtraInfo1 [VarChar](20) '../../../n:Supply/n:Extra/n:Info1',
ExtraInfo2 [VarChar](20) '../../../n:Supply/n:Extra/n:Info2',
ExtraInfo3 [VarChar](20) '../../../n:Supply/n:Extra/n:Info3',
ExtraInfo4 [VarChar](20) '../../../n:Supply/n:Extra/n:Info4',
ExtraInfo5 [VarChar](20) '../../../n:Supply/n:Extra/n:Info5',
ShedNo [VarChar](6) '../../../n:Supply/n:Egg/n:ShedNumber',
ShedType [VarChar](30) '../../../n:Supply/n:Egg/n:Type',
LayDate [VarChar](12) '../../../n:Supply/n:Dates/n:LayDate',
SupplyDate [VarChar](12) '../../../n:Supply/n:Dates/n:SupplyDate',
BestBefore [VarChar](12) '../../../n:Product/n:Dates/n:BestBeforeDate'
)
EXEC sp_xml_removedocument @hDoc