Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.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 2008 XML到SQL Server 2008摘要_Sql Server 2008_Xml Parsing - Fatal编程技术网

Sql server 2008 XML到SQL Server 2008摘要

Sql server 2008 XML到SQL Server 2008摘要,sql-server-2008,xml-parsing,Sql Server 2008,Xml Parsing,我需要从XML中提取记录并将其加载到SQL Server表中的进一步帮助 我把它作为我的@xml: <admin submitter_id="login0" effective_date="mm/dd/yyyy"> <rec effected_id="login1" adjustment="100.00" type="foo"> <reason reason_id="1" /> <reason reason_id="2" /> </rec&g

我需要从XML中提取记录并将其加载到SQL Server表中的进一步帮助

我把它作为我的
@xml

<admin submitter_id="login0" effective_date="mm/dd/yyyy">
<rec effected_id="login1" adjustment="100.00" type="foo">
<reason reason_id="1" />
<reason reason_id="2" />
</rec>
<rec effected_id="login2" adjustment="50.00" type="bar">
<reason reason_id="3" />
</rec>
</admin>
这有意义吗?对原因id的调整是一对多。我已经知道如何提取除第二行以外的所有值。我只能获取第一个原因id,然后它进入下一条记录。我认为这是可以击败交叉申请,但我不能得到它的工作。请帮忙


哦,我可能也收到了伪造的XML。如果这是错的,请告诉我

尝试使用此T-SQL代码段:

SELECT
    Submitter = @xml.value('(/admin/@submitter_id)[1]', 'varchar(50)'),
    EffectedID = Rec.value('(@effected_id)[1]', 'varchar(50)'),
    DateStamp = @xml.value('(/admin/@effective_date)[1]', 'varchar(50)'),
    TypeID = Rec.value('(@type)[1]', 'varchar(50)'),
    ReasonID = Reason.value('(@reason_id)[1]', 'int')
FROM
    @xml.nodes('/admin/rec') AS Tbl(Rec)
CROSS APPLY
    Rec.nodes('reason') AS T2(Reason)
它给了我一个输出:


您需要有两个嵌套的节点列表-第一个列表从
内部获取所有
节点,而第二个列表迭代每个
节点内部的所有
节点。这样,您就可以可靠地从这两个嵌套级别的子节点中提取所有信息,无论每个级别上有多少个子节点。

尝试使用此T-SQL代码片段:

SELECT
    Submitter = @xml.value('(/admin/@submitter_id)[1]', 'varchar(50)'),
    EffectedID = Rec.value('(@effected_id)[1]', 'varchar(50)'),
    DateStamp = @xml.value('(/admin/@effective_date)[1]', 'varchar(50)'),
    TypeID = Rec.value('(@type)[1]', 'varchar(50)'),
    ReasonID = Reason.value('(@reason_id)[1]', 'int')
FROM
    @xml.nodes('/admin/rec') AS Tbl(Rec)
CROSS APPLY
    Rec.nodes('reason') AS T2(Reason)
它给了我一个输出:


您需要有两个嵌套的节点列表-第一个列表从
内部获取所有
节点,而第二个列表迭代每个
节点内部的所有
节点。这样,您就可以可靠地从这两个嵌套级别的子节点中提取所有信息,无论每个级别上有多少个子节点。

类似的情况如何

DECLARE @Xml XML

SELECT @Xml = '<admin submitter_id="login0" effective_date="mm/dd/yyyy"> 
<rec effected_id="login1" adjustment="100.00" type="foo"> 
<reason reason_id="1" /> 
<reason reason_id="2" /> 
</rec> 
<rec effected_id="login2" adjustment="50.00" type="bar"> 
<reason reason_id="3" /> 
</rec> 
</admin>'

SELECT  @Xml,
        A2.B.value('(../../@submitter_id)[1]','VARCHAR(50)'),
        A2.B.value('(../@effected_id)[1]','VARCHAR(50)'),
        A2.B.value('(../../@effective_date)[1]','VARCHAR(50)'),
        A2.B.value('(../@adjustment)[1]','FLOAT'),
        A2.B.value('(../@type)[1]','VARCHAR(50)'),
        A2.B.value('(@reason_id)[1]','INT')
FROM    @XML.nodes('//admin/rec/reason')  A2(B)
DECLARE@Xml

选择@Xml='像这样的东西怎么样

DECLARE @Xml XML

SELECT @Xml = '<admin submitter_id="login0" effective_date="mm/dd/yyyy"> 
<rec effected_id="login1" adjustment="100.00" type="foo"> 
<reason reason_id="1" /> 
<reason reason_id="2" /> 
</rec> 
<rec effected_id="login2" adjustment="50.00" type="bar"> 
<reason reason_id="3" /> 
</rec> 
</admin>'

SELECT  @Xml,
        A2.B.value('(../../@submitter_id)[1]','VARCHAR(50)'),
        A2.B.value('(../@effected_id)[1]','VARCHAR(50)'),
        A2.B.value('(../../@effective_date)[1]','VARCHAR(50)'),
        A2.B.value('(../@adjustment)[1]','FLOAT'),
        A2.B.value('(../@type)[1]','VARCHAR(50)'),
        A2.B.value('(@reason_id)[1]','INT')
FROM    @XML.nodes('//admin/rec/reason')  A2(B)
DECLARE@Xml

选择@Xml=”这两个都很棒!非常感谢!我只能接受一个答案,但这两个答案对我所需要的都同样有效。@Matt:是的-你只能接受一个(有时很难决定)-但你至少可以投票否决所有这些好答案!没有限制…这两个都很棒!非常感谢!我只能接受一个答案,但这两个答案对我所需要的都同样有效。@Matt:是的-你只能接受一个(有时很难决定)-但你至少可以投票否决所有这些好答案!没有限制。。。