当您使用 XQuery 检索 SQL Server 2005 中的 XML 元素的值时,您会收到空值

Extended support for SQL Server 2005 ended on April 12, 2016

If you are still running SQL Server 2005, you will no longer receive security updates and technical support. We recommend upgrading to SQL Server 2014 and Azure SQL Database to achieve breakthrough performance, maintain security and compliance, and optimize your data platform infrastructure. Learn more about the options for upgrading from SQL Server 2005 to a supported version here.

注意:这篇文章是由无人工介入的微软自动的机器翻译软件翻译完成。微软很高兴能同时提供给您由人工翻译的和由机器翻译的文章, 以使您能使用您的语言访问所有的知识库文章。然而由机器翻译的文章并不总是完美的。它可能存在词汇,语法或文法的问题,就像是一个外国人在说中文时总是可能犯这样的错误。虽然我们经常升级机器翻译软件以提高翻译质量,但是我们不保证机器翻译的正确度,也不对由于内容的误译或者客户对它的错误使用所引起的任何直接的, 或间接的可能的问题负责。

点击这里察看该文章的英文版: 914638
本文已归档。它按“原样”提供,并且不再更新。
错误 #: 20011171 (SQLBUDT)
症状
您会收到一个 NULL 值时使用 XQuery 检索的 XML 元素的值,当满足下列条件都为真时:
  • XML 元素声明为关联的架构定义中具有简单内容的复杂类型。
  • 混合 属性中的 XML 元素声明关联的架构定义中的值为 true
  • 您可以使用 数据 函数来检索的 XML 元素的值。
原因
因为 XML 元素的值处理 XML 元素内联值作为 XML 元素声明为复杂类型的包含简单内容和混合内容时,会出现此问题。因此,数据 函数不能检索的 XML 元素的类型化的值。通常,作为 XML 元素的子代的类型化值的 XML 元素的值进行处理。
解决方案

服务包信息

若要解决此问题,获得最新的 service pack,Microsoft SQL Server 2005 年。有关详细的信息请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:
913089如何获取最新的 service pack,SQL Server 2005 年
替代方法
要变通解决此问题,请按照下列步骤操作:
  1. 您必须更改表列,针对有问题的 XML 架构集合验证其数据条目。此表的列必须由类型化的 XML 列更改为非类型化的 XML 列。若要执行此操作使用与以下内容类似的 TRANSACT-SQL 语句:
    ALTER TABLE <TableName> ALTER COLUMN <ColumnName> XMLGO
  2. 除去现有的 XML 架构集合。然后,创建一个新的 XML 架构集合具有相同的定义为在旧的 XML 架构的不同之处在于 混合 属性中的 XML 元素声明的值设置为 false。若要执行此操作使用与以下内容类似的 TRANSACT-SQL 语句:
    DROP XML SCHEMA COLLECTION <OldSchemaName>GOCREATE XML SCHEMA COLLECTION <NewSchemaName> AS N’<NewSchemaDefinition>’GO
  3. 请将表列中重新设置为类型化的 XML 列验证对新的 XML 架构集合。若要执行此操作使用与以下内容类似的 TRANSACT-SQL 语句:
    ALTER TABLE <TableName> ALTER COLUMN <ColumnName> XML(<NewSchemaName>)GO
注意<TableName> 值,该值代表表格的名称。<ColumnName> 值,该值代表 XML 表格列的名称。<OldSchemaName> 值,该值代表旧的有问题的架构集合的名称。<NewSchemaName> 值,该值代表新的架构集合的名称。<NewSchemaDefinition> 表示定义新的架构集合的代码。
状态
Microsoft 已经确认这是在"适用于"一节中列出的 Microsoft 产品中的问题。 Microsoft SQL Server 2005 Service Pack 1 中,第一次已得到纠正此问题。
更多信息
对于具有简单内容的复杂类型,我们不建议您将复杂类型的 混合 的属性的值设置为 true。万维网联合会 (W3C) Web 站点上可用的 XML 架构结构规格还讨论了此问题。有关详细信息,请参阅"3.4.3"一节和"3.4.4"下面的网站中的部分:

重现此问题的步骤

  1. 打开 SQL Server 2005 管理 Studio。
  2. 连接到 SQL Server 的实例。
  3. 展开 数据库 文件夹,然后单击您想要修改的数据库。
  4. 文件 菜单上指向 新建,然后单击 数据库引擎查询。将显示 查询编辑器 窗口。
  5. 将下面的代码示例粘贴到 查询编辑器 窗口中:
    create xml schema collection myschema as N'<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">	<xs:element name="ElementName" type="xs:integer" />			<xs:complexType name="newct" mixed="true">		<xs:simpleContent>			<xs:extension base="xs:integer">				<xs:attribute name="bar" type="xs:integer" />			</xs:extension>		</xs:simpleContent>	</xs:complexType></xs:schema>'gocreate table xml_test (pk int primary key identity(1,1), xmlcol xml(myschema))goinsert xml_test values ('<ElementName xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="newct" bar="10">30</ElementName>')goinsert xml_test values ('<ElementName>30</ElementName>')goselect xmlcol.query('data(/ElementName)')from xml_test
输出是类似于以下内容:
<empty>30
注意 在此输出 <empty>指示执行任何操作会出现。

但是,预计输出将类似于以下内容:
3030
参考
对于 XQuery 数据 函数的详细信息,请访问下面的 Microsoft 开发人员网络 (MSDN) 的网站:

属性

文章 ID:914638 - 上次审阅时间:12/09/2015 04:40:53 - 修订版本: 2.3

Microsoft SQL Server 2005 Standard Edition, Microsoft SQL 2005 Server Workgroup, Microsoft SQL Server 2005 Developer Edition, Microsoft SQL 2005 Server Enterprise

  • kbnosurvey kbarchive kbmt kbsql2005presp1fix kbsql2005xml kbsql2005tsql kbexpertiseadvanced kbtshoot kbprb KB914638 KbMtzh
反馈