SQL Server中读取XML文件的简单做法

作者:yuanye 来源:CSDN 时间:2008-12-23 15:29:00 

SQL Server 2000使得以XML导出数据变得更加简单,但在SQL Server 2000中导入XML数据并对其进行处理则有些麻烦。

如果你参考Books Online(BOL),你会发现有相关的条目,包括OPENXML以及 OPENROWSET。所有的这些例子都支持将XML文本作为已经声明的变量,这对于经常处理文本的用户来说非常方便,但对于希望在开发中读取XML文件并进行相应处理的开发人员来说就不是这样了。处理这样的问题,或许最好从内到外来对其进行分析。

OPENXML是一个rowset函数(即返回一个rowset),它的工作方式类似于rowset函数OPENQUERY和 OPENROWSET。使用OPENXML可以对XML数据执行JOINs操作而无需首先导入数据。你还可以将其同INSERT、SELECT、 UPDATE以及DELETE等操作联合使用。然而,要使用OPENXML,你必须执行两项OPENQUERY和OPENROWSET并不需要的任务。这两项任务需要两个系统存储进程。 第一个是sp_xml_preparedocument,它将读取特定的XML文本并将其内容提取到内存中。其语法如下:

sp_xml_preparedocument @hdoc = OUTPUT,
[, @xmltext = ]
[, @xpath_namespaces =



具体参数如下: @hdoc:指向某内存区域的句柄(从作用上看等同于一个指针),相关数据存放在这里。注意这是一个输出变量,当该进程运行后,该变量将包含指向XML文件内容在内存地址的句柄。由于你需要在随后使用此结果,因此要确保对其进行保存; @xmltext:实际上你所希望处理的XML文本; @xml_namespaces:为了正常操作你的XML数据所需要的任何名字空间索引(namespace references)。注意在这里出现的任何URL都需要用尖括号(< >)括起来; 假设所传递的这些参数都有效,并且XML文档存在,那么你的XML数据就会被存放到内存中去。现在你就可以调用 sp_xml_preparedocument,传递存放有XML文件的变量,然后执行OPENXML。语法如下:


OPENXML(idocint [in],rowpatternnvarchar[in],[flagsbyte[in]])
[WITH (SchemaDeclaration | TableName)]

注意:在本文中没有足够的文字来描述OPENXML所接收的参数。请参阅BOL以获取更多信息。在Transact-SQL Reference中查找OPENXML。

现在我们已经到达了最后的步骤。所有剩下的工作就是导入一个实际的XML文件到SQL并进行处理(很奇快为什么所有的BOL示例都没有涉及到这一关键的部分)。(我必须感谢我的同事Billy Pang所给予的帮助。他帮助我解决这个问题,并给出了代码——尽管出于本文需要我对代码进行了裁减。谢谢Billy!) 基本的技巧是,将文件逐行按文本读取。然后把所有读取的行连接为一个大的VARCHAR变量。最后,将变量传递给前面所说的代码。

以下就是读取文件并将其内容存放到某变量的代码:



DECLARE @FileName varchar(255)
DECLARE @ExecCmd VARCHAR(255)
DECLARE @y INT
DECLARE @x INT
DECLARE @FileContents VARCHAR(8000)
CREATE TABLE #tempXML(PK INT NOT NULL IDENTITY(1,1), ThisLine VARCHAR(255))
SET @FileName = 'C:\Temp\CurrentSettings.xml'
SET @ExecCmd = 'type ' + @FileName
SET @FileContents = ''
INSERT INTO #tempXML EXEC master.dbo.xp_cmdshell @ExecCmd
SELECT @y = count(*) from #tempXML
SET @x = 0
WHILE @x < > @y
BEGIN
SET @x = @x + 1
SELECT @FileContents = @FileContents + ThisLine from #tempXML WHERE PK
= @x
END
SELECT @FileContents as FileContents
DROP TABLE #tempXML



现在在变量@FileContents变量中你已经获得了文件的全部内容。所需要做的只是将变量通过@xmltext参数传递给sp_xml_preparedocument,然后再调用OPENXML。

有了这种解决办法,对XML文档进行各种处理就成为了可能。你可以将XML文档同SQL表格连接在一起而无需导入数据,然后对这些数据进行INSERT、PDATE和DELETE等任何操作。

标签:xml,sql,server,数据库,函数
0
投稿

猜你喜欢

  • 经验之谈:MySQL与ASP.NET配合更强大

    2008-12-23 15:26:00
  • asp下几种常用排序算法

    2011-04-18 10:33:00
  • 利用ASP远程注册DLL的方法

    2008-03-05 13:00:00
  • SQL Server 2008中有关XML的新功能

    2008-06-04 12:57:00
  • web开发以HTML为中心

    2008-02-13 08:14:00
  • 关于计算到期时间的问题

    2009-05-26 15:51:00
  • 几个javascript显示加载进度条代码

    2008-01-19 10:52:00
  • ASP使用wsImage组件给图片加水印

    2008-12-29 19:14:00
  • 实例讲解实现SQL下的字符串拆分具体方法

    2008-12-09 14:55:00
  • 用javascript来实现仿gogle动画导航

    2007-11-30 14:15:00
  • Oracle数据库游标使用大全

    2008-03-04 18:24:00
  • 浏览器中的内存泄露(续)解决方案

    2008-05-03 17:14:00
  • 安装MySQL的步骤和方法

    2009-07-30 08:38:00
  • HTML5硝烟弥漫

    2009-07-06 14:44:00
  • 如何用ASP获知机器的网络配置?

    2010-06-11 19:58:00
  • SqlServer 基础知识 数据检索、查询排序语句

    2011-11-03 16:46:12
  • 能说明一下GETROWS的用法吗?

    2009-11-02 20:12:00
  • ASP设计常见问题及解答精要

    2009-04-21 11:16:00
  • Frontpage2003的怪bug,自动添加“../”的父级目录

    2007-09-30 13:30:00
  • asp无组件备份与还原数据库

    2007-09-24 13:19:00
  • asp之家 网络编程 m.aspxhome.com