【发布时间】:2015-07-07 18:00:33
【问题描述】:
任何人都可以帮助我解决将 XML 数据导入 SQL Server 表的解决方案吗?我已经完成了我的研究,但这项任务对我来说很难完成。我发现的所有内容都适用于简单数据,但我的名字和值在“website_details”部分是分开的。这就是我的脚本无法正常工作的原因。我有大约 200 个 XML 文件,其中一些要导入的记录超过一千条,因此我无法更改它们的结构。我正在使用的数据被认为是机密的,因此我更改了值名称和值以使我能够发布它。
网站表的第一个插入命令完美运行并导入了我的所有数据。我遇到的问题是第二个插入命令。 @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'
;
【问题讨论】:
-
您能否举例说明粉碎 xml 后的预期结果,您提供的哪些示例是失败的尝试?
-
是的,XML 仍然被导入,但是第二个插入命令的一切都是空的。第一个插入命令没有错误。第一个插入命令运行良好,并按照应输入的方式导入了所有数据。
-
第二个 XML 节点不应该是 Websites/Website/Website_Details/Website_Detail?
-
这是我的错误。在实际的脚本中就是这样。
-
列名与第二次插入的 XML 数据不匹配怎么办?这里或脚本中的错误?
标签: sql sql-server xml