为什么这个存储过程只插入一个项目?

时间:2013-11-27 17:21:22

标签: sql xml sql-server-2008 parsing sqlxml

好的,所以,我对 SQL Server 2008 非常陌生但我的任务是创建一个程序,只需从某个地方加载一些XML文件并将其名称和数据解析为单个双栏表。

以下是给定文件内容的一般概念(尽管它包含大约100个实际条目):

<root>
<data name="Sword of Doom" xml:space="preserve"><value>+1 to Nubs</value></data>
<data name="Sword of Doom+1" xml:space="preserve"><value>+2 to Nubs</value></data>
</root>

对,很容易,对吧?我希望。以下脚本将运行整个文件(我知道这是因为我的文件在结束时遇到了非法字符),但它 将不会 创建一个包含多个条目的表(即,它只插入XML文件的第一个条目)。我试过看看它是否是一个编码问题,将它保存在记事本中以及Notepad ++中的不同内容......但是,nope。

我不明白,我在这里做错了什么?这是我的批量装载方式吗?

    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO

   CREATE PROCEDURE TestParse AS
    BEGIN
    IF OBJECT_ID('dbo.TRANS', 'U') IS NOT NULL
        DROP TABLE TRANS
    DECLARE @XmlFile XML
    SELECT @XmlFile = BulkColumn
    FROM OPENROWSET(BULK 'C:/TestTest.xml', SINGLE_BLOB) as x

    CREATE TABLE dbo.TRANS
    (
        NAME VARCHAR(255),
        DATA VARCHAR(255)
    )
    BEGIN
        INSERT INTO TRANS
        (
            NAME,
            DATA
        )
        SELECT
            x.TRANS.value('(/root)[1]','varchar(255)') AS DATA,
            x.TRANS.value('(/root/data/@name)[1]', 'varchar(255)') AS NAME
        FROM @XmlFile.nodes('/root') AS x (TRANS)
    END
    select * from TRANS
END
GO

选择的内容始终是包含“毁灭之剑”的单行NAME和包含“+1 to Nubs”的DATA。当我调用它时,只有一行受此存储过程影响('exec TestParse')。

这里的任何指导都会有所帮助。

1 个答案:

答案 0 :(得分:0)

要获得2行,您必须将root/data传递给nodes()函数:

select
    x.TRANS.value('(value/text())[1]','varchar(255)') as DATA,
    x.TRANS.value('@name', 'varchar(255)') as NAME
from @XmlFile.nodes('/root/data') as x(TRANS)

<强> sql fiddle demo