繁体   English   中英

如何将数据从XML导入SQL Server?

[英]How do I import data from XML to SQL Server?

谁能帮助我解决我的解决方案,以将XML数据导入到SQL Server表中? 我已经完成了研究,但是这个任务对我来说很难完成。 我发现的所有内容都适用于简单数据,但是我的名称和值在“ website_details”部分中是分开的。 这就是为什么我的脚本无法正常工作的原因。 我大约有200个XML文件,每个文件要导入一千多条记录,因此我无法更改它们的结构。 我正在使用的数据被认为是机密的,因此我更改了值名称和值以使其能够发布。

网站表的第一个insert命令可以正常工作,并且可以导入我的所有数据。 我遇到的问题是第二个插入命令。 我认为问题所在是@ xmlData.nodes定义。 在“ website_details”部分中,我很难定义结构,因为名称和值与其他信息不同,是分开的。

现在仅概述一下我的数据库,该数据库由两个表组成。 它们是网站website_details Web_ID列包含在两个表中,并且是将website_details连接到网站的外键。 我也有一种观点,我正在使用这种观点来合并名为website_view的数据。

我已经为此工作了几周,最后得出的结论是,我需要一点帮助来实现这一目标。

这是从我的XML文件中提取的示例数据:

<WEBSITES>
    <WEBSITE>
        <WEBSITE_ID>sta001</WEBSITE_ID>
        <WEBSITE_ALTERNATE_ID/>
        <WEBSITE_VERSION>4</WEBSITE_VERSION>
        <TYPE>DYNAMIC</TYPE>
        <NAME>TEST WEBSITE</NAME>
        <WEBSITE_DETAILS>
            <WEBSITE_DETAIL>
                <NAME>COST</NAME>
                <VALUE>500</VALUE>
                <INHERITED>false</INHERITED>
            </WEBSITE_DETAIL>
            <WEBSITE_DETAIL>
                <NAME>LANGUAGE</NAME>
                <VALUE>EN</VALUE>
                <INHERITED>false</INHERITED>
            </WEBSITE_DETAIL>
            <WEBSITE_DETAIL>
                <NAME>DATABASE</NAME>
                <VALUE/>
                <INHERITED>false</INHERITED>
            </WEBSITE_DETAIL>
        </WEBSITE_DETAILS>
    </WEBSITE>
    <WEBSITE>
        <Website_ID>mmn023</WEBSITE_ID>
        <WEBSITE_ALTERNATE_ID/>
        <WEBSITE_VERSION>3</WEBSITE_VERSION>
        <TYPE>DYNAMIC</TYPE>
        <NAME>TEST WEBSITE 2</NAME>
        <WEBSITE_DETAILS>
            <WEBSITE_DETAIL>
                <NAME>COST</NAME>
                <VALUE>750</VALUE>
                <INHERITED>false</INHERITED>
            </WEBSITE_DETAIL>
            <WEBSITE_DETAIL>
                <NAME>LANGUAGE</NAME>
                <VALUE>RU</VALUE>
                <INHERITED>false</INHERITED>
            </WEBSITE_DETAIL>
            <WEBSITE_DETAIL>
                <NAME>DATABASE</NAME>
                <VALUE>TRUE</VALUE>
                <INHERITED>false</INHERITED>
            </WEBSITE_DETAIL>
        </WEBSITE_DETAILS>
    </WEBSITE>
</WEBSITES>

这是我正在使用的存储过程:

USE [websitesDB]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[SP_website_import] (
 @xmlData XML ,
 @retValue varchar(100) OUTPUT
)

AS
BEGIN
SET @retValue='Failed';



INSERT INTO  [websites](
[Web_ID],
[Web_Version],
[Web_Type],
[Web_Name]
)

SELECT
[Table].[Column].value('WEBSITE_ID [1]', 'nvarchar(100)'),
[Table].[Column].value('WEBSITE_VERSION [1]', 'nvarchar(100)'),
[Table].[Column].value('TYPE [1]', 'nvarchar(100)'),
[Table].[Column].value('NAME [1]', 'nvarchar(100)')

 FROM @xmlData.nodes('/ WEBSITES / WEBSITE') as [Table]([Column])
IF(@@ROWCOUNT > 0 )
  SET @retValue='SUCCESS';


INSERT INTO  [website_details](
[Web_ID],
[cost],
[language],
[database]
)

SELECT
[Table].[Column].value('WEBSITE_ID [1]', 'nvarchar(100)'),
[Table].[Column].value('COST [1]', 'nvarchar(100)'),
[Table].[Column].value('LANGUAGE [1]', 'nvarchar(100)'),
[Table].[Column].value('DATABASE [1]', 'nvarchar(100)')

 FROM @xmlData.nodes('/ WEBSITES / WEBSITE / WEBSITE_DETAILS') as [Table]([Column])
IF(@@ROWCOUNT > 0 )
  SET @retValue='SUCCESS'

;

在SQL Server上的XQuery中工作时,我喜欢直接到达需要数据的节点,在使用数据岛时,请使用“ ../”遍历。 例如,从WEBSITE_DETAIL岛获取WEBSITE_ID,您可以使用以下内容。

SELECT
[Table].[Column].value('../../WEBSITE_ID[1]', 'nvarchar(100)'),
[Table].[Column].value('NAME[1]', 'nvarchar(100)'),
[Table].[Column].value('VALUE[1]', 'nvarchar(100)'),
[Table].[Column].value('INHERITED[1]', 'nvarchar(100)')
FROM @xmlData.nodes('/WEBSITES/WEBSITE/WEBSITE_DETAILS/WEBSITE_DETAIL') as [Table]([Column])

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM