当前位置:数据库 > SQL语言> 正文

SQL如何操作Xml字段

时间:2014-6-18类别:数据库

SQL如何操作Xml字段

SQL如何操作Xml字段

SQL操作Xml字段实例

 

一、查询操作

在定义了一个XML类型的数据之后,我们最常用的就是查询操作,下面我们来介绍如何使用SQL语句来进行查询操作的。

在T-Sql中,提供了两个对XML类型数据进行查询的函数,分别是query(xquery)和value(xquery, dataType),其中,query(xquery)得到的是带有标签的数据,而value(xquery, dataType)得到的则是标签的内容。接下类我们分别使用这两个函数来进行查询。

 

1、使用query(xquery) 查询

我们需要得到书的标题(title),使用query(xquery)来进行查询,查询语句为:

select @xmlDoc.query('/book/title')

 

2、使用value(xquery, dataType) 查询

同样是得到书的标题,使用value函数,需要指明两个参数,一个为xquery, 另一个为得到数据的类型。看下面的查询语句:

select @xmlDoc.value('(/book/title)[1]', 'nvarchar(max)')

 

3、查询属性值

无论是使用query还是value,都可以很容易的得到一个节点的某个属性值,例如,我们很希望得到book节点的id,我们这里使用value方法进行查询,语句为:

select @xmlDoc.value('(/book/@id)[1]', 'nvarchar(max)')

 

4、使用xpath进行查询

xpath是统一的Xml查询语句。使用XPath可以方便的得到想要的节点,而不用使用where语句。例如,我们在@xmlDoc中添加了另外一个节点

例如:得到id为0002的book节点

select @xmlDoc.query('(/root/book[@id="0002"])')

 

 

二、修改操作

SQL的修改操作包括更新和删除。SQL提供了modify()方法,实现对Xml的修改操作。modify方法的参数为XML修改语言。XML修改语言类似于SQL 的Insert、Delete、UpDate,但并不一样。

 

1,我们先建一个表:Student(id,content /xml)

  •  
     
  • SQL 代码 复制
  • 
    create table Student
    (id int primary key,content xml)
    
    insert into dbo.Student
    values(1000,'<Students>
        <Student  id="1001">
            <name>aaa</name>
            <age>20</age>
            <birthday>1991-2-20</birthday>
        </Student>
        <Student  id="1002">
            <name>bbb</name>
            <age>21</age>
            <birthday>1990-2-20</birthday>
        </Student>    
    </Students>')
    
    		
  •  

    2,添加学生节点,就是添加一个学生,用到modify的insert into语句,后面的/为xml节点的路径

  •  
     
  • SQL 代码 复制
  • 
    update dbo.Student      
    set content.modify('
    insert <Student  id="1003">
        <name>aaa</name>
        <age>20</age>
        <birthday>1991-2-20</birthday>
        </Student>
    as last
    into (/Students)[1]
    ')
    
    		
  •  

    3,添加属性,用到modify的insert into语句

  •  
  • SQL 代码 复制
  • 
    update dbo.Student       
    set content.modify('
    insert attribute sex {"男"}
    into (/Students/Student[@id="1003"])[1]
    ')
    
    		
  •  

    4,添加字段add,用到modify的insert into语句

  •  
     
  • SQL 代码 复制
  • 
    update dbo.Student      
    set content.modify('
    insert <add>江苏丰县</add>
    as last
    into (/Students/Student[@id="1003"])[1]
    ')
    
    		
  •  

    5,删除学生节点,用到modify的delete语句,[@id="1003"]为删除的条件,像t-sql中的where一样

  •  
     
  • SQL 代码 复制
  • 
    update dbo.Student       
    set content.modify('
    delete /Students/Student[@id="1003"]
    ')
    
    		
  •  

    6,更改学生节点字段,用到modify语句中的replace语句,text()表示的是add节点的值

  •  
     
  • SQL 代码 复制
  • 
    update dbo.Student      
    set content.modify('
    replace value of (/Students/Student[@id="1003"]/add/text())[1]
    with "江苏徐州"
    ')
    
    		
  •  

    7,更改学生节点属性,用到modify语句中的replace语句,@id表示的是add节点的属性的值

  •  
     
  • SQL 代码 复制
  • 
    update dbo.Student      
    set content.modify('
    replace value of (/Students/Student[@id="1003"]/@id)[1]
    with 1004
    ')
    
    		
  •  

    8,查询所有学生的ID和姓名

  •  
  • SQL 代码 复制
  • 
    select Student1.content.value('./@id','int') as ID,   
    Student1.content.value('(/Students/Student/name)[1]','nvarchar(30)') as StuName    
    from dbo.Student
    CROSS APPLY content.nodes('/Students/Student') as Student1(content)
    
    		
  •  

    标签:
    上一篇下一篇

    猜您喜欢

    热门推荐