SQLServer中读取XML文件的简单做法
时间:2007-12-23 来源:不详 作者:迈克DB
假如你参考BooksOnline(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文件内容在内存地址的句柄。由于你需要在随后使用此结果,因此要确保对其进行保存; copyright dedecms
@xmltext:实际上你所希望处理的XML文本;
@xml_namespaces:为了正常操作你的XML数据所需要的任何名字空间索引(namespacereferences)。注重在这里出现的任何URL都需要用尖括号(<>)括起来;
假设所传递的这些参数都有效,并且XML文档存在,那么你的XML数据就会被存放到内存中去。现在你就可以调用sp_xml_preparedocument,传递存放有XML文件的变量,然后执行OPENXML。语法如下:
OPENXML(idocint[in],rowpatternnvarchar[in],[flagsbyte[in]])
[WITH(SchemaDeclaration|TableName)]
注重:在本文中没有足够的文字来描述OPENXML所接收的参数。请参阅BOL以获取更多信息。在Transact-SQLReference中查找OPENXML。
现在我们已经到达了最后的步骤。所有剩下的工作就是导入一个实际的XML文件到SQL并进行处理(很奇快为什么所有的BOL示例都没有涉及到这一要害的部分)。
(我必须感谢我的同事BillyPang所给予的帮助。他帮助我解决这个问题,并给出了代码——尽管出于本文需要我对代码进行了裁减。谢谢Billy!)
基本的技巧是,将文件逐行按文本读取。然后把所有读取的行连接为一个大的VARCHAR变量。最后,将变量传递给前面所说的代码。
copyright dedecms
以下就是读取文件并将其内容存放到某变量的代码:
DECLARE@FileNamevarchar(255)
DECLARE@ExecCmdVARCHAR(255)
DECLARE@yINT
DECLARE@xINT
DECLARE@FileContentsVARCHAR(8000)
CREATETABLE#tempXML(PKINTNOTNULLIDENTITY(1,1),ThisLineVARCHAR(255))
SET@FileName=’C:\Temp\CurrentSettings.xml’
SET@ExecCmd=’type’ @FileName
SET@FileContents=’’
INSERTINTO#tempXMLEXECmaster.dbo.xp_cmdshell@ExecCmd
SELECT@y=count(*)from#tempXML
SET@x=0
WHILE@x<>@y
BEGIN
SET@x=@x 1
SELECT@FileContents=@FileContents ThisLinefrom#tempXMLWHEREPK
=@x
END
SELECT@FileContentsasFileContents
DROPTABLE#tempXML
现在在变量@FileContents变量中你已经获得了文件的全部内容。所需要做的只是将变量通过@xmltext参数传递给sp_xml_preparedocument,然后再调用OPENXML。
文章评论
共有位Admini5网友发表了评论 查看完整内容