XML DB on SQL Server2005

本文介绍如何在SQL Server 2005中使用XML数据类型及其提供的方法,包括Query(), Value(), Exist(), Modify() 和 Nodes()等,并展示了如何创建XML架构集合、表、索引以及进行数据的检索和更新。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

XML DB on SQL Server2005
       SQL Server2005中新增了一个xml类型来增强对XML数据的存储,检索。并提供了一组方法对xml类型的操作:
Query()    此方法用于对xml实例进行查询
Value()    此方法用于取出xml实例的值
Exist()     此方法用于确定查询返回非空的结果
Modify()   此方法用于指定XML DML语句执行更新
Nodes()    此方法用于将 XML 拆分成多行以将 XML 文档的组成部分传播到行集中。
 
创建架构集合:
CREATE XML SCHEMA COLLECTION mysc AS
'<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"               
                xmlns:xdb="http://xmlns.oracle.com/xdb">
            <xs:complexType name="CADDRType" xdb:SQLType="XML_CADDR">
              <xs:sequence>
                <xs:element name="CST_ADDR_STREET" type="xs:string"/>
                <xs:element name="CST_ADDR_CITY" type="xs:string"/>
                <xs:element name="CST_ADDR_STATE" type="xs:string"/>
                <xs:element name="CST_ADDR_ZIP" type="xs:string"/>
                <xs:element name="CST_ADDR_COUNTRY" type="xs:string"/>
              </xs:sequence>
            </xs:complexType>
            <xs:element name="CUSTOMER">
              <xs:complexType xdb:SQLType="XML_CUSTOMER">
                <xs:sequence>
                  <xs:element name="CST_ID" type="xs:float" nillable="false"/>
                  <xs:element name="CST_NAME" type="xs:string"/>
                 <xs:element name="CST_TYPE" type="xs:string"/>
                  <xs:element name="CST_EMAIL" type="xs:string"/>
                  <xs:element name="CST_ADDR" type="CADDRType"/>
                  <xs:element name="CST_PHONE" type="xs:string"/>
                  <xs:element name="CST_JOINDATE" type="xs:date"/>
                  <xs:element name="CST_DESCRIPTION" type="xs:string"/>                     
                </xs:sequence>
              </xs:complexType>
            </xs:element>
          </xs:schema>'
 
创建表:
Create table MyXmlTable
(
       Key1        int,
XmlColumn xml mysc
);
 
添加一条记录:
Insert into MyXmlTable (Key1,XmlColumn)
Values (1,‘<CUSTOMER>
         <CST_ID>1973</CST_ID>
         <CST_NAME>FOODWORLD</CST_NAME>
         <CST_TYPE>MERCHANT</CST_TYPE>
         <CST_EMAIL>foodworld@foodinc.com</CST_EMAIL>
         <CST_ADDR>
               <CST_ADDR_STREET>18 SALISBURY ARCADE</CST_ADDR_STREET>                
               <CST_ADDR_CITY>TACOMA</CST_ADDR_CITY>
               <CST_ADDR_STATE>WASHINGTON</CST_ADDR_STATE>
               <CST_ADDR_ZIP>94682</CST_ADDR_ZIP>
               <CST_ADDR_COUNTRY>USA</CST_ADDR_COUNTRY>
         </CST_ADDR>
         <CST_PHONE>345-879-893</CST_PHONE>
         <CST_JOINDATE>1990-02-18</CST_JOINDATE>
         <CST_DESCRIPTION>GROCERY MERCHANT</CST_DESCRIPTION>
</CUSTOMER>'));
 
创建索引:
CREATE PRIMARY XML INDEX 索引名称
ON 表名(列名)
 
检索数据:
Select XmlColumn.query(’/CUSTOMER/CST_NAME’)
from MyXmlTable
根据指定的XPath路径检索所有的节点,包含节点的标签
 
Select XmlColumn. value(’/CUSTOMER/CST_NAME[1]’,varchar(50))
from MyXmlTable
根据指定的XPath路径检索节点的值,不包含节点的标签
 
Select XmlColumn,.query(’/CUSTOMER/CST_NAME’)
from MyXmlTable
 where XmlColumn.exist(’ /CUSTOMER[CST_ID=”1973”]’) = 1
1,表示 True(如果查询中的 XQuery 表达式返回一个非空结果)。即,它至少返回一个 XML 节点。
0,表示 False(如果它返回一个空结果)。
 
 
xml实例添加节点:
Update 表名 set 实例.modify(
       ‘Insert (XML标记) (as first|as last)
Into|after|before (XPath路径) ’)
 
删除xml实例节点:
Update 表名 set 实例.modify(
       ‘delete (XPath路径) ’)
 
替换xml实例节点的值:
Update 表名 set 实例.modify(
       ‘ replace value of (XPath路径)
       With ’)
 
例如:将<CST_ID >2000</CST_ID >插入到XmlColumn对象的第1此出现的CUSTOMER标记的第1个子节点
Update MyXmlTable set XmlColumn.modify(‘Insert <CST_ID >2000</CST_ID >
       As first into (/CUSTOMER)[1]’)
 
 
结合VSnet2005中的应用
SQLQuery.sql
Create Table UserInfoTab
(
    UserID varchar(50) primary key,
    UserInfo xml
);
 
go
 
select isnull(max(UserID),getdate()) from UserInfoTab
 
delete UserInfoTab
 
go
 
select userid,userInfo from UserInfoTab
where userInfo.query('/UserInfo/UserName = "liuqiang"')
 
 
select UserID,UserInfo
from UserInfoTab 
where
userInfo.value('(/UserInfo/UserName)[1]','varchar(50)') like '%liu%'
UserInfo.cs
using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Data.Sql;
using System.Data.SqlClient;
using System.Data.SqlTypes;
using System.Xml;
using System.IO;
 
///<summary>
///用户信息类
///</summary>
public class UserInfo
{
    public UserInfo(string name,int age,string address,string email,string phone)
    {
        this.strUserName    = name;
        this.intUserAge     = age;
        this.strUserAddress = address;
        this.strUserEMail   = email;
        this.strUserPhone   = phone;
    }
 
    private string strUserID      = null;
    private string strUserName    = null;
    private int    intUserAge     = 0;
    private string strUserAddress = null;
    private string strUserEMail   = null;
    private string strUserPhone   = null;
 
    #region相关属性
    ///<summary>
    ///用户编号
    ///</summary>
    public string UserID
    {
        get
        {
            return this.strUserID;
        }
    }
 
    ///<summary>
    ///用户名称
    ///</summary>
    public string UserName
    {
        get
        {
            return this.strUserName;
        }
    }
 
    ///<summary>
    ///用户年龄
    ///</summary>
    public int UserAge
    {
        get
        {
            return this.intUserAge;
        }
    }
 
    ///<summary>
    ///用户地址
    ///</summary>
    public string UserAddress
    {
        get
        {
            return this.strUserAddress;
        }
    }
 
    ///<summary>
    ///用户电子邮件
    ///</summary>
    public string UserEMail
    {
        get
        {
            return this.strUserEMail;
        }
    }
 
    ///<summary>
    ///用户电话
    ///</summary>
    public string UserPhone
    {
        get
        {
            return this.strUserPhone;
        }
    }
    #endregion
 
    ///<summary>
    ///数据库连接字符串
    ///</summary>
    private static string conString = "Data Source=.;Initial Catalog=XMLDatabase;Integrated Security=True";
 
    public static string CreateUserID()
    {
        return DateTime.Now.ToString();
    }
 
    ///<summary>
    ///添加一条新记录
    ///</summary>
    ///<param name="user">用户信息对象</param>
    ///<returns>操作是否成功</returns>
    public static bool InsertNewUser(UserInfo user)
    {
        string userID = CreateUserID();
        XmlDocument doc = ObjectToDOM(user);
        MemoryStream stream = new MemoryStream();//建立临时内存流
        doc.Save(stream);
 
        using (SqlConnection conn = new SqlConnection())
        {
            conn.ConnectionString = conString;
            conn.Open();
 
            SqlCommand cmd = new SqlCommand();
            cmd.Connection = conn;
            cmd.CommandType = CommandType.Text;
            cmd.CommandText = "Insert into UserInfoTab(UserID,UserInfo) values(@UserID,@UserInfo)";
 
            cmd.Parameters.AddWithValue("@UserID" , userID);
            cmd.Parameters.AddWithValue("@UserInfo", new SqlXml(stream));
 
            int result = cmd.ExecuteNonQuery();
 
            conn.Close();
            return result > 0 ? true : false;
        }
    }
 
    ///<summary>
    ///根据用户信息编号查询用户信息
    ///</summary>
    ///<param name="userID">用户信息编号</param>
    ///<returns>xml读取器</returns>
    public static XmlReader SelectUserByID(string userID)
    {
        using (SqlConnection conn = new SqlConnection())
        {
            conn.ConnectionString = conString;
            conn.Open();
            SqlCommand cmd = new SqlCommand();
            cmd.Connection = conn;
            cmd.CommandType = CommandType.Text;
            cmd.CommandText = "Select UserInfo from UserInfoTab where UserID=@UserID";
 
            cmd.Parameters.AddWithValue("@UserID", userID);
 
            using (SqlDataReader reader = cmd.ExecuteReader(CommandBehavior.CloseConnection))
            {
                SqlXml xmlDoc;
                if (reader.Read())
                {
                    xmlDoc = reader.GetSqlXml(0);
                    XmlReader xmlRader = xmlDoc.CreateReader();
                    return xmlRader;
                }
                else
                {
                    xmlDoc = null;
                    return null;
                }
            }
           
        }
    }
 
    ///<summary>
    ///将对象转换成XML文档格式
    ///</summary>
    ///<param name="user">用户信息</param>
    ///<returns>xml文档对象</returns>
    public static XmlDocument ObjectToDOM(UserInfo user)
    {
        XmlDocument doc = new XmlDocument();
        XmlDeclaration dec = doc.CreateXmlDeclaration("1.0",null,null);
        doc.AppendChild(dec);
        XmlElement info = doc.CreateElement("UserInfo");
        doc.AppendChild(info);
 
        XmlElement name = doc.CreateElement("UserName");
        name.InnerText = user.strUserName;
        info.AppendChild(name);
 
        XmlElement age = doc.CreateElement("UserAge");
        age.InnerText = user.intUserAge.ToString();
        info.AppendChild(age);
 
        XmlElement address = doc.CreateElement("UserAddress");
        address.InnerText = user.strUserAddress;
        info.AppendChild(address);
 
        XmlElement email = doc.CreateElement("UserEMail");
        email.InnerText = user.strUserEMail;
        info.AppendChild(email);
 
        XmlElement phone = doc.CreateElement("UserPhone");
        phone.InnerText = user.strUserPhone;
        info.AppendChild(phone);
 
        return doc;
    }
 }
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值