簡體   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