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

文章翻译 文章翻译
文章编号: 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> XML
    GO
    
  2. 除去现有的 XML 架构集合。然后,创建一个新的 XML 架构集合具有相同的定义为在旧的 XML 架构的不同之处在于 混合 属性中的 XML 元素声明的值设置为 false。若要执行此操作使用与以下内容类似的 TRANSACT-SQL 语句:
    DROP XML SCHEMA COLLECTION <OldSchemaName>
    GO
    
    CREATE 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"下面的网站中的部分:
http://www.w3.org/TR/xmlschema-1/#Complex_Type_Definitions

重现此问题的步骤

  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>'
    go
    
    create table xml_test (pk int primary key identity(1,1), xmlcol xml(myschema))
    go
    
    insert xml_test values ('
    <ElementName xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="newct" bar="10">30</ElementName>')
    go
    
    insert xml_test values ('
    <ElementName>30</ElementName>')
    go
    
    select xmlcol.query('data(/ElementName)')
    from xml_test
    
输出是类似于以下内容:
<empty>
30
注意 在此输出 <empty>指示执行任何操作会出现。

但是,预计输出将类似于以下内容:
30
30

参考

对于 XQuery 数据 函数的详细信息,请访问下面的 Microsoft 开发人员网络 (MSDN) 的网站:
http://msdn2.microsoft.com/en-us/library/ms187038.aspx

属性

文章编号: 914638 - 最后修改: 2006年4月6日 - 修订: 2.3
这篇文章中的信息适用于:
  • Microsoft SQL Server 2005 Standard Edition
  • Microsoft SQL 2005 Server Workgroup
  • Microsoft SQL Server 2005 Developer Edition
  • Microsoft SQL 2005 Server Enterprise
关键字:?
kbmt kbsql2005presp1fix kbsql2005xml kbsql2005tsql kbexpertiseadvanced kbtshoot kbprb KB914638 KbMtzh
机器翻译
注意:这篇文章是由无人工介入的微软自动的机器翻译软件翻译完成。微软很高兴能同时提供给您由人工翻译的和由机器翻译的文章, 以使您能使用您的语言访问所有的知识库文章。然而由机器翻译的文章并不总是完美的。它可能存在词汇,语法或文法的问题,就像是一个外国人在说中文时总是可能犯这样的错误。虽然我们经常升级机器翻译软件以提高翻译质量,但是我们不保证机器翻译的正确度,也不对由于内容的误译或者客户对它的错误使用所引起的任何直接的, 或间接的可能的问题负责。
点击这里察看该文章的英文版: 914638
Microsoft和/或其各供应商对于为任何目的而在本服务器上发布的文件及有关图形所含信息的适用性,不作任何声明。 所有该等文件及有关图形均"依样"提供,而不带任何性质的保证。Microsoft和/或其各供应商特此声明,对所有与该等信息有关的保证和条件不负任何责任,该等保证和条件包括关于适销性、符合特定用途、所有权和非侵权的所有默示保证和条件。在任何情况下,在由于使用或运行本服务器上的信息所引起的或与该等使用或运行有关的诉讼中,Microsoft和/或其各供应商就因丧失使用、数据或利润所导致的任何特别的、间接的、衍生性的损害或任何因使用而丧失所导致的之损害、数据或利润不负任何责任。

提供反馈

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com