Sql server 2008 XML到SQL Server 2008摘要
我需要从XML中提取记录并将其加载到SQL Server表中的进一步帮助 我把它作为我的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
:
<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:是的-你只能接受一个(有时很难决定)-但你至少可以投票否决所有这些好答案!没有限制。。。