Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server OpenXML无法使用名称空间,可能是原始XML文件问题?_Sql Server_Xml - Fatal编程技术网

Sql server OpenXML无法使用名称空间,可能是原始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文件导入SQL表时遇到问题。如果我编辑该文件以删除其他名称空间,我会得到正确的结果,但由于我们希望自动化这一过程,这是不可行的

XML文件的开头如下所示:

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