首页 > 数据库 > SQL Server > 正文

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

2024-08-31 00:49:31
字体:
来源:转载
供稿:网友
 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等任何操作。

,欢迎访问网页设计爱好者web开发。
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表