ASE中xml服务使用方法简介
ASE自12.5.1开始在内部处理中支持xml;自15.x版本xml功能得到进一步完善。
ASE15.x中使用xml不需要额外的license。
一、导出xml文档
在ASE的select语句中加入关键字for xml即可以xml格式显示结果集。
语法:
限制:
- for xml select语句不能包括into_clause、compute_clause、read_only_clause、isolation_clause、browse_clause 或 plan_clause。
- 不能在命令create view、declare cursor、subquery 或 execute command中指定 for xml select。
- 不能在以下命令中使用for xml 子查询:for xml select、create view、declare cursor、select into;亦不能将其用作定量判定子查询,如 any/all、in/not in、exists/not exists。
下面举例导出xml格式的SQL查询结果集:
以SQL:select id,name,crdate from sysobjects where type='S' 为例。
首先,启用 XML服务
sp_configure "enable xml",1
然后,执行:select id,name,crdate from sysobjects where type='S' for xml 返回xml格式的结果集。
为了防止出现堆内存(参数:heap memory per user)不足的情况,建议使用选项:incremental=yes (incremental=yes表示:从指定for xml的select语句中返回多行)。
将isql执行结果保存到文件系统上的文本文件,可以实现将ASE表数据保存为xml文档的需求。
如下脚本/tmp/xml.sh供参数:
$cat /tmp/xml.sh
UserName=$1
PassWd=$2
ServerName=$3
FullTableName=$4
isql -U${UserName} -P${PassWd} -S${ServerName} -w5000 -b <<EOF
set nocount on
go
set textsize 100000000
go
select * from ${FullTableName} for xml option "incremental=yes"
--select * from ${FullTableName} for xml all option "incremental=yes"
go
quit
EOF
脚本使用方法:/tmp/xml.sh sa "" redhat6 "testdb..sysobjects" > testdb..sysobjects.xml
二、读取xml文档的数据
利用ASE中的代理表&CIS组件可以访问操作系统上的目录和文件,进而使用xmlextract提取xml文档的信息。
需要启用CIS组件和文件访问参数:
- 检验是否将配置参数 enable cis 设置为1: sp_configure "enable cis",1
- 使用 sp_configure 启用文件访问: sp_configure "enable file access",1
创建执行目录/dev/shm的代理表xmlxfsTab:
create proxy_table xmlxfsTab external directory at "/dev/shm;R"
查看目录/dev/shm下文件:
select filename,size,filetype from xmlxfsTab
下面SQL语句返回:testdb..sysobjects.xml文档中id<10或者name="sysroles"的记录集:
set textsize 100000000
select filename ,xmlextract('//resultset/row[id<10 or name="sysroles"]',content) from xmlxfsTab where filename='testdb..sysobjects.xml'
下面SQL语句返回:testdb..sysobjects.xml文档中id<10或者name="sysroles"的表名列表:
set textsize 100000000
select filename ,xmlextract('//resultset/row[id<10 or name="sysroles"]/name',content) from xmlxfsTab where filename='testdb..sysobjects.xml'
在执行xmlextract函数时,如果xml文档大小过大,会报堆内存不足的错误。
建议根据提示增加参数:heap memory per user。sp_configure "heap memory per user",NNNNNNN
另外,也可以用java,SAX,DOM,JDOM等工具来解析xml文档。
三、函数xmltable的用法
函数xmltable能根据xml内容返回一个SQL表。对xmltable()的单个调用可取代在每次迭代时对xmlextract进行多次调用的T-SQL循环;调用xmltable()相当于对由xmltable()生成的表的每行执行单个xmlextract表达式。
例子:
declare @a text
select @a=(select id,name,type,crdate,sysstat from sysobjects for xml)
select @a
select * from xmltable('/resultset/row' passing @a columns id int , name varchar(255)) as xml_table
go
对于包含id,name,type,crdate,sysstat列的xml形式数据,xmltable能够生成包含id、name两列的SQL表。