从SQLServer中读取XML文件
2007-11-11 08:38:10 来源:WEB开发网核心提示:sql server(WINDOWS平台上强大的数据库平台) 2000使得以xml(标准化越来越近了)导出数据变得更加简单,但在sql server(WINDOWS平台上强大的数据库平台) 2000中导入xml(标准化越来越近了)数据并对其进行处理则有些麻烦,从SQLServer中读取XML文件,如果你参考Books
sql server(WINDOWS平台上强大的数据库平台) 2000使得以xml(标准化越来越近了)导出数据变得更加简单,但在sql server(WINDOWS平台上强大的数据库平台) 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,
[, @xml(标准化越来越近了)text = ]
[, @xpath_namespaces =
具体参数如下:
@hdoc:指向某内存区域的句柄(从作用上看等同于一个指针),相关数据存放在这里。注意这是一个输出变量,当该进程运行后,该变量将包含指向xml(标准化越来越近了)文件内容在内存地址的句柄。由于你需要在随后使用此结果,因此要确保对其进行保存;
@xml(标准化越来越近了)text:实际上你所希望处理的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变量中你已经获得了文件的全部内容。所需要做的只是将变量通过@xml(标准化越来越近了)text参数传递给sp_xml(标准化越来越近了)_preparedocument,然后再调用OPENxml(标准化越来越近了)。
有了这种解决办法,对xml(标准化越来越近了)文档进行各种处理就成为了可能。你可以将xml(标准化越来越近了)文档同SQL表格连接在一起而无需导入数据,然后对这些数据进行INSERT、PDATE和DELETE等任何操作。
- ››sqlserver 每30分自动生成一次
- ››sqlserver安装和简单的使用
- ››SqlServer触发器、存储过程和函数
- ››SQLServer建立交叉表查询
- ››SqlServer强制断开数据库连接的方法
- ››SQLServer 2005 海量数据解决方案
- ››SQLServer 2008数据库查看死锁、堵塞的SQL语句
- ››SqlServer 插入多条数据
- ››SQLServer 2008 R2导出的SQL文件中没有数据
- ››SQLSERVER通过游标查询两个数据表共有字段名组合成...
- ››sqlserver2008实现拼音首字母和随机n位数的生成
- ››读取Excel文件,在页面上以HTML格式显示出来
更多精彩
赞助商链接