⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 11398.htm

📁 一本很基础的SQL讲解
💻 HTM
📖 第 1 页 / 共 5 页
字号:
<TD class=listBullet vAlign=top>&#8226;</TD>
<TD class=listItem>
<P>可以支持复杂属性,例如,一个文档的作者属性可能是该作者的联系信息。 </P></TD></TR></TBODY></TABLE>
<P>可以将对象属性存储在 XML 数据类型的列中并建立索引,从而提高查询处理的效率。</P>
<H3>数据交换和工作流</H3>
<P>XML 允许采用平台无关的方式在应用程序之间交换数据。可以使用 XML 标记将这样的数据建模为消息。代替不断地分割和生成 XML 消息,以 XML 的格式存储消息是明智的。这正是数据流所需要的。到达工作流阶段的 XML 消息携带着当前的状态。每个消息都需要进行处理,处理的进展记录在 XML 内容中(如状态改变),然后将 XML 数据转发到工作流处理的下一个阶段。消息可能是不同类型的,甚至可能是半结构化的,并且有不同的 XML 架构与它们相关联,因此将它们映射到表并不总是一件轻而易举的事。 </P>
<P>针对不同垂直领域(如金融数据和地理空间数据)的基于 XML 的标准正在形成。这些标准根据可以查询和更新的实例数据来描述数据的结构。通常,实际数据采用的是二进制形式,而 XML 数据提供关于它们的元数据信息。</P>
<P>举一个简单的例子,为了将一个输入参数表传送到存储程序或函数,应用程序首先将数据转换成 XML,然后将其作为一个 XML 数据类型参数进行传递。在存储过程或函数内,从 XML 参数重新生成行集。 </P>
<H3>文档管理</H3>
<P>假设有一个呼叫中心,它采用 XML 文档来维护患者记录和谈话。当患者发起呼叫时,呼叫中心希望恢复前面的谈话以设置传入呼叫的情景。这可以通过查询 XML 标记实现,从而给应用程序带来好处。此外,还可以方便地检索以前谈话的细节并记录当前的谈话。 </P>
<P>像电子邮件之类的文档本质上是半结构化的。带有 XML 标记的文档正变得越来越容易创建,例如,使用 Office 2003。可以将这些 XML 文档存储在 XML 列中,并建立索引,进行查询和更新。因此,通过利用原生 XML 支持,开发人员可以做更多的事情。</P>
<DIV style="MARGIN-TOP: 3px; MARGIN-BOTTOM: 10px">#p#<STRONG>三、SQL Server 2005 中的服务器端 XML 处理</STRONG></DIV>
<P>SQL Server 2005 支持包括提供一个数据库,在这个数据库中,您可以存储关系数据和 XML 数据。 </P>
<H3>XML 数据类型</H3>
<P>您可以使用普通的 CREATE TABLE 语句来创建带有 XML 列的表。然后就可以采用一种特别的方式来建立 XML 的索引。</P>
<H4>非类型化的 XML</H4>
<P>SQL Server 2005 XML 数据类型实现了 ISO SQL-2003 标准 XML 数据类型。因此,它不仅可以存储格式良好的 XML 1.0 文档,而且可以存储所谓的 XML 内容片段(带有文本节点和任意数目的顶层元素)。在对数据进行格式良好性检查时,并不要求将 XML 数据类型绑定到 XML 架构,但是格式不规范的数据将被拒绝。 </P>
<P>当架构不是已知先验的 并且因此而导致基于映射的解决方案不可能实现时,就可以使用非类型化的 XML。如果架构是已知的,但映射到关系数据模型非常复杂并且难于维护,或者存在多个架构而且这些架构是后来根据外部要求绑定到数据的,也可以使用非类型化的 XML。 </P>
<P>例:表中非类型化的 XML 列</P>
<P>下面的语句创建一个名为“docs”的表,该表带有整型主键“pk”和非类型化的 XML 列“xCol”:</P><PRE class=codeSample>CREATE TABLE docs (pk INT PRIMARY KEY, xCol XML not null)
</PRE>
<P>也可以创建一个包含多个 XML 列或关系列、带主键或不带主键的表。</P>
<H4>类型化的 XML</H4>
<P>如果 XML 架构集合中有描述 XML 数据的 XML 架构,就可以将 XML 架构集合与产生类型化 XML 的 XML 列相关联。可以使用 XML 架构来验证数据的有效性,在编译查询和数据修改语句时执行比非类型化的 XML 更精确的类型检查,以及优化存储和查询处理。</P>
<P>类型化的 XML 列、参数和变量可以存储 XML 文档或内容,可以在声明时将其指定为一个选项(分别为DOCUMENT 或 CONTENT,默认为 CONTENT)。此外,还必须提供 XML 架构集合。如果每个 XML 实例都正好有一个顶层元素,则指定 DOCUMENT;否则,使用 CONTENT。查询编译器在类型检查中使用 DOCUMENT 标记来推理 singleton 顶层元素。 </P>
<P>例:表中的类型化 XML 列</P>
<P>XML 列、变量和参数可以绑定到一个 XML 架构集合(请参阅本文后面的“XML 架构处理”一节以获得更多的详细信息和示例)。假定 myCollection 代表这样一个集合。下面的语句创建一个表 XmlCatalog,带有使用 myCollection 进行类型化的 XML 列文档。类型化的 XML 列还被指定为接受 XML 片段,而不只是 XML 文档。</P><PRE class=codeSample>CREATE TABLE XmlCatalog ( 
   ID INT PRIMARY KEY, 
   Document XML(CONTENT myCollection))
</PRE>
<H4>约束 XML 数据类型的列</H4>
<TABLE cellSpacing=0 cellPadding=0 border=0>
<TBODY>
<TR>
<TD class=listBullet vAlign=top>&#8226;</TD>
<TD class=listItem>
<P>除了类型化一个 XML 列之外,还可以在类型化和非类型化的 XML 数据类型的列中使用关系(列或行)约束。大部分 SQL 约束同样可应用于 XML 列,值得注意的唯一例外是主键和外键约束,因为 XML 数据类型的实例是不兼容的。因此,可以指定 XML 列可为空或不可为空,提供默认值,并且在列中定义 CHECK 约束。例如,非类型化的 XML 列可以有 CHECK 约束来验证存储的 XML 实例是否符合 XML 架构。 </P></TD></TR></TBODY></TABLE>
<P>在下列条件下使用约束: </P>
<TABLE cellSpacing=0 cellPadding=0 border=0>
<TBODY>
<TR>
<TD class=listBullet vAlign=top>&#8226;</TD>
<TD class=listItem>
<P>业务规则不能用 XML 架构表示。例如,花店的交付地址必须在其业务场所 50 英里的范围内,这可以编写成 XML 列中的一个约束条件。该约束条件可以包括 XML 数据类型的方法。 </P></TD></TR>
<TR>
<TD class=listBullet vAlign=top>&#8226;</TD>
<TD class=listItem>
<P>约束条件涉及表中其他的 XML 或 非 XML 列。这样的一个例子就是,使 XML 实例中存在的 Customer (/Customer/@CustId) 的id 与整型 CustomerID 列中的值相匹配。 </P></TD></TR></TBODY></TABLE>
<P>例:约束 XML 列</P>
<P>要确定&lt;book&gt;的&lt;author&gt;的&lt;last-name&gt; 不同于&lt;author&gt;的&lt;first-name&gt; ,可以指定下列 CHECK 约束:</P>
<P>CREATE TABLE docs (pk INT PRIMARY KEY, xCol XML not nullCONSTRAINT CK_name CHECK (xCol.exist('/book/author[first-name = last-name]') = 0))</P>
<H4>文本编码 </H4>
<P>SQL Server 2005 将 XML 数据存储为 Unicode (UTF-16)。从服务器检索的XML 数据,其结果也是 UTF-16 编码的。如果想要采用一种不同的编码方式,就需要在检索数据之后进行必要的转换,转换的方法有两种,一种是通过强制类型转换,另一种是在中间层执行转换。例如,可以在服务器上将 XML 数据强制转换成 varchar 类型,在这种情况下,数据库引擎会通过 varchar 类型的排序所确定的编码方式来序列化 XML。</P>
<H4>存储 XML 数据</H4>
<P>可以通过多种方式为 XML 列、参数或变量提供 XML 值。 </P>
<TABLE cellSpacing=0 cellPadding=0 border=0>
<TBODY>
<TR>
<TD class=listBullet vAlign=top>&#8226;</TD>
<TD class=listItem>
<P>作为隐式转换到 XML 数据类型的字符或二进制 SQL 类型。 </P></TD></TR>
<TR>
<TD class=listBullet vAlign=top>&#8226;</TD>
<TD class=listItem>
<P>作为文件的内容。 </P></TD></TR>
<TR>
<TD class=listBullet vAlign=top>&#8226;</TD>
<TD class=listItem>
<P>作为 XML 发布机制 FOR XML 的输出(带有生成 XML 数据类型实例的 TYPE 指令) </P></TD></TR></TBODY></TABLE>
<P>对提供的值进行格式良好性检查,并且允许存储 XML 文档和 XML 片段。如果数据没有通过格式良好性检查,则拒绝它,并发出一个适当的错误消息。</P>
<P>对于类型化的 XML,需要检查提供的值是否符合已注册到类型化 XML 列的 XML 架构集合的 XML 架构。如果该 XML 实例没有通过这种有效性验证,则拒绝它。此外,仅当 CONTENT 允许提供 XML 文档和内容时,类型化的 XML 中的 DOCUMENT 标记才将所接受的值限制为 XML 文档。</P>
<P>例:将数据插入非类型化的 XML 列</P>
<P>下列语句在表 docs 中新插入一行,其中在整型的 pk 列插入的值为 1,而在 XML 列插入的是 实例。 数据(作为字符串提供)被隐式地转换为 XML 数据类型,并且在插入的过程中进行格式良好性检查。 </P><PRE class=codeSample>INSERT INTO docs VALUES (1, 
'&lt;book genre="security" publicationdate="2002" ISBN="0-7356-1588-2"&gt;
   &lt;title&gt;Writing Secure Code&lt;/title&gt;
   &lt;author&gt;
      &lt;first-name&gt;Michael&lt;/first-name&gt;
      &lt;last-name&gt;Howard&lt;/last-name&gt;
   &lt;/author&gt;
   &lt;author&gt;
      &lt;first-name&gt;David&lt;/first-name&gt;
      &lt;last-name&gt;LeBlanc&lt;/last-name&gt;
   &lt;/author&gt;
   &lt;price&gt;39.99&lt;/price&gt;
&lt;/book&gt;')
</PRE>
<P>例:将来自文件的数据插入非类型化的 XML 列</P>
<P>如下所示的 INSERT 语句使用 OPENROWSET 读取文件 C:\temp\xmlfile.xml 的内容作为 BLOB。在表 docs 中新插入一行,值 10 作为主键,而 BLOB 作为 XML 列 xCol。格式良好性检查出现在文件内容分配到 XML 列时。</P><PRE class=codeSample>INSERT INTO docs 
SELECT 10, xCol
FROM    (SELECT * FROM OPENROWSET 
      (BULK 'C:\temp\xmlfile.xml',
      SINGLE_BLOB) AS xCol) AS R(xCol)
</PRE>
<P>例:将数据插入类型化的 XML 列</P>
<P>类型化的 XML 列需要 XML 实例数据指定用于对其进行类型化的 XML 架构的目标命名空间(该命名空间可以为空)。在下面的示例中,这是通过命名空间声明 xmlns=http://myDVD 来实现的。 </P><PRE class=codeSample>INSERT XmlCatalog VALUES(2, 
'&lt;?xml version="1.0"?&gt;
&lt;dvdstore xmlns="http://myDVD"&gt;
  &lt;dvd genre="Comedy" releasedate="2003"&gt;
    &lt;title&gt;My Big Fat Greek Wedding&lt;/title&gt;
    &lt;price&gt;19.99&lt;/price&gt;
  &lt;/dvd&gt;
&lt;/dvdstore&gt;')
</PRE>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -