我想知道如何将XML文件插入SQL Server DB。以下是我拥有的XML,但是我不确定如何以可扩展的方式进行此操作。我的想法是在Insert Into Select语句中,但是我不知道随着数据的增加它是否会起作用。预先谢谢你!
<Records>
<Record>
<ID SpecNum="5069580" IssueNum="001" SpecStatus="Pre-Approved">
<NutritionDetails>
<NutrientFacts>
<NutrientNameId>ENERC_KCAL</NutrientNameId>
<NutrientName>ENERC_KCAL</NutrientName>
<NutrientPer100gUnrounded>1.91</NutrientPer100gUnrounded>
<NutrientPer100gRounded>191</NutrientPer100gRounded>
</NutrientFacts>
</NutritionDetails>
</ID>
</Record>
</Records>
答案 0 :(得分:0)
成功创建了正确的有效XML之后,您应该可以使用以下T-SQL代码获取详细信息:
SELECT
-- get the attributes from the <ID> node
IDSpecNum = XC.value('(ID/@SpecNum)[1]', 'int'),
IDIsseNum = XC.value('(ID/@IssueNum)[1]', 'int'),
IDSpecStatus = XC.value('(ID/@SpecStatus)[1]', 'varchar(100)'),
-- get the element values from the children of the <NutrientFacts> node
NutrientNameId = NUT.value('(NutrientNameId)[1]', 'varchar(100)'),
NutrientName = NUT.value('(NutrientName)[1]', 'varchar(100)'),
NutrientPer100gUnrounded = NUT.value('(NutrientPer100gUnrounded)[1]', 'decimal(20,4)'),
NutrientPer100gRounded = NUT.value('(NutrientPer100gRounded)[1]', 'decimal(20,4)')
FROM
dbo.YourTable
CROSS APPLY
-- get one XML fragment per <Record>
XmlData.nodes('/Records/Record') AS XT(XC)
CROSS APPLY
-- get one XML fragment per <NutrientFacts> inside
XC.nodes('ID/NutritionDetails/NutrientFacts') AS XT2(NUT)
第一个CROSS APPLY
基本上会获得一个“内联伪表”,其中在表的<Record>
列中XML中的每个XmlData
节点都有一个XML片段(这只是一个<我坚强的假设-适应您的现实!)。这些XML片段被称为“伪表” XT
,其中只有一列XC
。
有了该XC
列的XML片段,您可以从<ID>
的{{1}}节点“进入”并获取属性值-这是前三个值。
然后,基于<Record>
伪表,我应用另一个XT
来获取CROSS APPLY
内的所有<NutrientFacts>
节点-这些节点被称为伪表{{ 1}}和列<ID> / <NutritionDetails>
,该列又为每个XT2
节点保存一个XML片段;我进入该XML节点,并从该节点的子元素中提取值-这些是select中显示的四个附加值。
现在,您拥有一个返回所有值的NUT
-您可以轻松获取所需的位并将其用于<NutrientFacts>
方案中。享受吧!
更新:将XML文件从磁盘( SQL Server 计算机的文件系统上的本地磁盘)导入表中-使用类似这样的东西:
SELECT
再次:适应您的需求-我不知道您是否要在INSERT INTO dbo.MyTable(list-of-columns) SELECT list-of-columns :......
中插入其他信息-我什至都不知道您的表名;您可以一次从磁盘加载一个XML