好的,所以,我对 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')。
这里的任何指导都会有所帮助。
答案 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 强>