使用简单的T-SQL XML语法传递参数(转)
原文地址:http://www.edulife.com.cn/Infos/200608/2514527295.html
这篇文章描述一种通过内嵌的OPENXML T-SQL行设定语句分析所给的XML串从一个T-SQL存储过程到另一个传递输入参数的变化数量的选择方法。参数传递的XML 串表示将采用下列形式:
<MSG P1="V1" P2="V2" P3="V3" ....... Pn="Vn"/>
这里P1,P2...Pn是参数名和V1,V2,V3 Vn是它们的数值。
这种方法的主要优势是全部输入参数通过一个XML串传递。这能创建一种在整个应用程序中传递参数的标准方式,在数据库里从一个程序到另一个或者从任何语言(VB,PowerBuilder,C,等等)所写的客户应用程序。这是有可能的,因为XML 串是在不同的平台和技术之间交流的一种标准方法。
这种方法的另一个优势是参数可以以任何顺序读写,从取址和写入完成到赋予XML标签。 这消除了对调用程序时对参数顺序担心的需要。这一方法的缺点是在构造和分析XML 参数串时所需要的开销。
我设计了一个简单但是有效的T-SQL存储程序(sp_get_xml_parameter_value),它得到XML参数串值(xmlString)和取到的标签名(xmlTag)。 结果被输入xmlValue作为输出。如果标签名不存在,返回一个零值。 程序从OPENXML 内部表格表示中建立一个暂时表。然后它通过在这个临时创建的OPENXML结果上自连接来链接所给标签元素的ID和它的值。正如程序中所示。
下面是程序代码
Create procedure sp_get_xml_parameter_value (@xmlString varchar(2000),
@xmlTag varchar(400),
@xmlValue varchar(400) OUTPUT)
AS
BEGIN
declare @Idoc int
set nocount on
set @xmlValue = NULL
EXEC sp_xml_preparedocument @Idoc OUTPUT, @xmlString
SELECT [id],parentid,nodetype,localname,[text]
into #xmlTable
FROM OPENXML (@Idoc, '/MSG',1)
select @xmlValue = CONVERT (varchar(400),b.[text])
from #xmlTable a, #xmlTable b
where a.localname = @xmlTag and
a.nodetype = 2 and
a.id = b.parentid and
b.nodetype = 3
set nocount off
END
go
Here is a T-SQL script example for calling the procedure:
declare @xmlString varchar(2000)
declare @xmlTag varchar(400)
declare @xmlValue varchar(400)
set @xmlString = '<MSG ID="ELI LEIBA" COMPANY="IEC" DESCRIPTION="APPLICATION DBA IN COMPANY"/>'
set @xmlTag = 'DESCRIPTION'
exec sp_get_xml_parameter_value @xmlString ,@xmlTag, @xmlValue OUTPUT
print @xmlValue
set @xmlTag = 'COMPANY'
exec sp_get_xml_parameter_value @xmlString ,@xmlTag, @xmlValue OUTPUT
print @xmlValue
set @xmlTag = 'ID'
exec sp_get_xml_parameter_value @xmlString ,@xmlTag, @xmlValue OUTPUT
print @xmlValue
After running the script, we get:
APPLICATION DBA IN COMPANY
IEC
ELI LEIBA
总之,我这里显示的程序能在应用过程中实现一种输入参数传递的方法。 全部输入参数被组合在一个XML 串然后送到被调用程序。然后轮到这个被调用的程序通过sp_get_xml_parameter_value来取出它所需要的参数。 这个程序能创建一个参数传递的标准并且消除了知道参数顺序的必要性。