加入收藏 | 设为首页 | 会员中心 | 我要投稿 鄂州站长网 (https://www.0711zz.com/)- 数据分析、网络、云渲染、应用安全、大数据!
当前位置: 首页 > 数据库 > MsSql > 正文

XML 在SQLServer中的使用

发布时间:2021-01-17 16:13:07 所属栏目:MsSql 来源:互联网
导读:SQL Server对于XML支持的核心在于XML数据的格式,这种数据类型可以将XML的数据存储于数据库的对象中,比如variables, columns, and parameters。当你用XML

SQL Server对于XML支持的核心在于XML数据的格式,这种数据类型可以将XML的数据存储于数据库的对象中,比如variables,columns,and parameters。当你用XML数据类型配置这些对象中的一个时,你指定类型的名字就像你在SQLServer 中指定一个类型一样。

XML的数据类型确保了你的XML数据被完好的构建保存,同时也符合ISO的标准。在定义一个XML数据类型之前,我们首先要知道它的几种限制,如下:

  • 一个实例的XML列不能包含超过2GB的数据。
  • 一个XML的列不能是索引。
  • XML对象不能使用Group By的子句中。
  • XML的数据类型不支持比较和排序。

定义一个XML变量

DECLARE @ClientList XML
SET @ClientList =
'


John
Doe

Jane
Doe

'
SELECT @ClientList
GO

这个例子通过使用DECLARE 声明去定义名为@ClientList 的变量,当我声明变量的时候,只需要包含XML的数据类型的名字在变量名后。

我设定了变量的值,然后使用select 来检索这个值。和我们想的一样,它返回了XML的文档。如下:


John
Doe

Jane
Doe

接下来我们看看如何定义一个XML的列

在下面的例子中,我将创建一个商店客户的表,表中存储了ID和每个商店的客户信息。

USE AdventureWorks2008R2
GO
IF OBJECT_ID('dbo.StoreClients') IS NOT NULL
DROP TABLE dbo.StoreClients
GO
CREATE TABLE dbo.StoreClients
(
StoreID INT IDENTITY PRIMARY KEY,ClientInfo XML NOT NULL
)
GO

接下来插入数据到这个表中,包括XML的文档和片段。我将声明一个XML的变量,然后用这个变量插入这个文档到表的数据行里面。

DECLARE @ClientList XML
SET @ClientList =
'


John
Doe

Jane
Doe

'
INSERT INTO dbo.StoreClients (ClientInfo)
VALUES(@ClientList)
GO

尽管变量将整个XML文档插入了进来,但是它是被当做一个单一的值插入到表列里面来。

正如以上所述,创建和插入都是很直接简单的,接下来我们看一下如何创建一个XML的参数

定义一个XML参数

例如,我定义@StoreClients 作为一个输入参数,并且配置它为XML的类型

USE AdventureWorks2008R2
GO
IF OBJECT_ID('dbo.AddClientInfo','P') IS NOT NULL
DROP PROCEDURE dbo.AddClientInfo
GO
CREATE PROCEDURE dbo.AddClientInfo
@StoreClients XML
AS
INSERT INTO dbo.StoreClients (ClientInfo)
VALUES(@StoreClients)
GO

然后我们再看看在存储过程中如何使用XML作为参数:

DECLARE @ClientList XML
SET @ClientList =
'


John
Doe

Jane
Doe

'
EXEC dbo.AddClientInfo @ClientList

过程也是很直接,先将XML数据赋值给变量,然后将变量作为参数执行SP,这是查询你会发现数据已经在表中了。

现在我们要学习一下XML类型支持的方法:query(),value().

在这之前我们要知道一种表达式,就是XQuery,它是一种强大的脚本语言,用来获取XML的数据。SQLServer 支持这种语言的子集,所以我们能使用这种语言的表达式来检索和修改XML的数据。

注意:

那我们现在先来通过例子来看一下query()和value 两个方法是如何使用XML数据的。需要注意的是我接下来的测试环境是SQLServer2008 R2。实例中包含了ClientDB 数据库、ClientInfoCollection 的XML数据以及ClientInfo 表。

USE master;
GO

IF DB_ID('ClientDB') IS NOT NULL
DROP DATABASE ClientDB;
GO

CREATE DATABASE ClientDB;
GO

USE ClientDB;
GO

IF OBJECT_ID('ClientInfoCollection') IS NOT NULL
DROP XML SCHEMA COLLECTION ClientInfoCollection;
GO

CREATE XML SCHEMA COLLECTION ClientInfoCollection AS
'<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns="urn:ClientInfoNamespace"
targetNamespace="urn:ClientInfoNamespace"
elementFormDefault="qualified">
<xsd:element name="People">

'; GO

IF OBJECT_ID('ClientInfo') IS NOT NULL
DROP TABLE ClientInfo;
GO

CREATE TABLE ClientInfo
(
ClientID INT PRIMARY KEY IDENTITY,Info_untyped XML,Info_typed XML(ClientInfoCollection)
);

INSERT INTO ClientInfo (Info_untyped,Info_typed)
VALUES
(
'<?xml version="1.0" encoding="UTF-8"?>

John Doe Jane Doe ',' John Doe Jane Doe ' );

Listing 1: 创建测试环境和数据

The XML query() Method

query方法,通常被用来返回一个指定XML子集的无类型的XML实例,如下,用括号加单引号来实现表达式,语法:

db_object.query('xquery_exp')

当我们调用这个方法时,用真实数据库对象替换掉引号内的表达式。通过实例来比较一下结果有什么不一样。

SELECT Info_untyped.query('/People')
  AS People_untyped
FROM ClientInfo;

Listing 2: 使用query() 来获得元素中的值

在这种情况下,将返回标签下所有的元素,包括子元素属性以及它们的值。


  John
    Doe
  
  Jane
    Doe
  

Listing 3: 结果集返回了/People 的内容

假如打算检索类型化的列中的 元素的内容,我需要修改XQuery的表达式。如Listing 4

SELECT Info_typed.query(
  'declare namespace ns="urn:ClientInfoNamespace";
  /ns:People') AS People_typed
FROM ClientInfo;

Listing 4: 使用query() 来检索类型化的XML列,然后你运行这个语句,就会得到结果如Listing5

John
    Doe
  
  Jane
    Doe
  

Listing 5: 展示结果

如上,我们发现两种结果是很接近的,唯一的区别就是类型化的列里面包含了涉及的命名空间。

如果我们打算获得子下一级,子元素的内容,我们需要修改表达式,通过添加/Person 到路径名称中,如下:

SELECT 
  Info_untyped.query(
    '/People/Person') AS People_untyped,Info_typed.query(
    'declare namespace ns="urn:ClientInfoNamespace";
    /ns:People/ns:Person') AS People_typed
FROM ClientInfo;

Listing 6: 检索 元素

John
  Doe

Jane
  Doe

Listing 7: 这个结果集是非类型化数据的结果

John
  Doe

Jane
  Doe

Listing 8: 这个结果集是类型化数据的结果

(编辑:鄂州站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读