mssqlserver中读取xml文件技巧

  然而,要使用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:TempCurrentSettings.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等任何操作。

时间: 2024-07-29 12:32:32

mssqlserver中读取xml文件技巧的相关文章

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

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

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

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

ASP.NET中读取XML文件信息的4种方法与示例代码_实用技巧

方法一 :使用XML控件 <% @ Page Language="C#"%> <html> <body>          <h3><font face="Verdana">读取XML方法一</font></h3>        <from runat=server>         <asp:Xml id="xml1" DocumentSour

在asp.net中读取XML文件

asp.net|xml 读: //打开某文件(假设web.config在根目录中)string filename=Server.MapPath("/") + @"WebApplication1\web.config";XmlDocument xmldoc= new XmlDocument();xmldoc.Load(filename); //得到顶层节点列表XmlNodeList topM=xmldoc.DocumentElement.ChildNodes;fore

dom4j从jar包中读取xml文件的方法_java

进行封装的时候,我们常常需要用xml来定义一些规范,在单独运行读取的时候当然不会有问题,但这些xml是往往是放在jar包里的,这样一来,这些东西就找不出来了.文中用到的xml定义如下: 复制代码 代码如下: <?xml version="1.0" encoding="utf-8"?><ACCESOS> <item>  <SOCIO name="adsf">   <NUMERO>00045

SQL Server读取XML文件的做法

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

javascript读取Xml文件做一个二级联动菜单示例

 这篇文章主要介绍了使用javascript中读取Xml文件做成的一个二级联动菜单,需要的朋友可以参考下  代码如下: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">  <html>  <head>  <title>menu2level.html</title>  <meta http-equiv="content-type&quo

php中使用DOM类读取XML文件的实现代码_php技巧

主要功能:php中使用DOM类读取XML文件 设计知识点: 1.XML节点循环读取 2.用iconv()函数实现编码转换,防止中文乱码 holiday.xml文件如下 复制代码 代码如下: <?xml version="1.0" encoding="UTF-8"?> <daysOff-overTime> <year> <yearName>2012</yearName> <holiday> <

firefox中JS读取XML文件_javascript技巧

firefox中JS读取XML文件 在网上搜"firefox中JS读取XML文件"的方法,找了半天,好多都是问了没人答的.看到一堆程序员在抱怨firefox:"除了累死程序员没什么好处.",言归正传.firefox不支持ie中的ActiveXObject对象,要得到一个XML DOM有以下2种方法:1.document.implementation.createDocument("", "", null);2.window.X