关于sqlserver2005的xml问题 100FCPPS]

发布时间:2014-1-1 0:09:51编辑:www.fx114.net 分享查询网我要评论
本篇文章主要介绍了"关于sqlserver2005的xml问题 100FCPPS]",主要涉及到关于sqlserver2005的xml问题 100FCPPS]方面的内容,对于关于sqlserver2005的xml问题 100FCPPS]感兴趣的同学可以参考一下。

有如下三个对象 declare @XML xml, @XmlNode nvarchar(100), @NodeValue nvarchar(max) set @XML = '<CN>中国</CN><CN2>中国3</CN2>' set @XmlNode  = '<CN3>' set @NodeValue = 'ABC' 上面只是给出大概参数,我的目的是通过@XmlNode节点名称看是否在@XML里存在 1、如果存在改变值为@NodeValue  2、不存在添加一个新的节点@XmlNode,值为@NodeValue 估计是能力不够,我始终没有找到好的方法在sql中运用,请大家给我数下怎么做? 另外@NodeValue中可能含有特殊字符,如‘<’,该怎么屏蔽?

DECLARE @xml XML,@XmlNode NVARCHAR(100),@NodeValue NVARCHAR(MAX) SET @XML='<CN>中国</CN><CN2>中国3</CN2>' SET @XmlNode='CN3' --由于在进行xquery操作时,使用的是节点名,所以无须写成<CN3>这样的格式,否则,还要先把<>替换掉 SET @NodeValue='<ABC' --这里就使用了xml的特殊字符,或者说预定义实体.后面的插入操作使用的是CDATA转义. /*由于xml数据类型进行操作时,xquery必须是字串常量,所以没有办法,只有构建动态语句了*/ /*或许有其它写法,但我接触sql2005也就不到两星期,还不知道,待其它人补了*/ DECLARE @sql NVARCHAR(MAX) DECLARE @b BIT /*用exist方法检查节点名是否存在*/ SET @sql=N'SELECT @b=@xml.exist(''//' + @XmlNode + ''')' EXEC sp_executeSQL @sql,N'@b BIT OUT,@xml XML',@b OUT,@xml /*若待检测的节点不存在,则进行insert*/ IF @b=0 BEGIN SET @sql=N'SET @xml.modify(''insert <' + @XmlNode + '><![CDATA[' + @NodeValue + ']]></' + @XmlNode + '> as last into (/)[1]'')' EXEC sp_executeSQL @sql,N'@xml XML OUT',@xml OUT END SELECT @xml /* <CN>中国</CN><CN2>中国3</CN2><CN3>&lt;ABC</CN3> */ /*如果将@xml变量convert为nvarchar,那么用字串操作也是可以的,就不需要用sp_executeSQL这么麻烦了,但这就不是XML方法了,如果要进行的操作稍复杂一点,比如某个xqery比较复杂,这种转换的方式得不尝失*/

非常感谢

DECLARE @idoc int DECLARE @doc varchar(1000) SET @doc =' <ROOT> <Customer CustomerID="VINET" ContactName="Paul Henriot">    <Order CustomerID="VINET" EmployeeID="5" OrderDate="1996-07-04T00:00:00">       <OrderDetail OrderID="10248" ProductID="11" Quantity="12"/>       <OrderDetail OrderID="10248" ProductID="42" Quantity="10"/>    </Order> </Customer> <Customer CustomerID="LILAS" ContactName="Carlos Gonzlez">    <Order CustomerID="LILAS" EmployeeID="3" OrderDate="1996-08-16T00:00:00">       <OrderDetail OrderID="10283" ProductID="72" Quantity="3"/>    </Order> </Customer> <Customer CustomerID="Pard" ContactName="Pard Suzhou">    <Order CustomerID="Pard" EmployeeID="4" OrderDate="1996-08-16T00:00:00">       <OrderDetail OrderID="10283" ProductID="72" Quantity="3"/>    <OrderDetail OrderID="10283" ProductID="75" Quantity="25"/>    </Order> </Customer> </ROOT>' --Create an internal representation of the XML document. EXEC sp_xml_preparedocument @idoc OUTPUT, @doc /* -- Execute a SELECT statement that uses the OPENXML rowset provider. SELECT    * FROM       OPENXML (@idoc, '/ROOT/Customer',1)             WITH (CustomerID  varchar(10),                   ContactName varchar(20)) SELECT    * FROM       OPENXML (@idoc, '/ROOT/Customer/Order',1)             WITH (CustomerID  varchar(10),                   EmployeeID int,       OrderDate datetime) */ -- SELECT stmt using OPENXML rowset provider SELECT * FROM   OPENXML (@idoc, '/ROOT/Customer/Order/OrderDetail',2)          WITH (Employee  int  '../@EmployeeID',                Customer  varchar(10) '../@CustomerID',                OrderDate   datetime    '../@OrderDate',                ProdID      int         '@ProductID',                Qty         int         '@Quantity')


上一篇:关于游标的使用问题。。。。。 50分,无满意结帖,结帖人fendy5201]
下一篇:2000的DTS包导入到2005以后不好用 50coolingpipe]

相关文章

相关评论

本站评论功能暂时取消,后续此功能例行通知。

一、不得利用本站危害国家安全、泄露国家秘密,不得侵犯国家社会集体的和公民的合法权益,不得利用本站制作、复制和传播不法有害信息!

二、互相尊重,对自己的言论和行为负责。

好贷网好贷款