代码之家  ›  专栏  ›  技术社区  ›  Cine

SQL Server XSD SimpleType xs:列表为表?

  •  1
  • Cine  · 技术社区  · 16 年前

    SQLServer支持XML,但我不知道如何让它与列表类型一起工作

    <?xml version="1.0" encoding="utf-16"?>
    <xsd:schema id="XMLSchema1"
       targetNamespace="http://tempuri.org/XMLSchema1.xsd"
       elementFormDefault="qualified"
       xmlns="http://tempuri.org/XMLSchema1.xsd"
       xmlns:mstns="http://tempuri.org/XMLSchema1.xsd"
       xmlns:xsd="http://www.w3.org/2001/XMLSchema">
      <xsd:simpleType name="valuelist">
         <xsd:list itemType="xsd:integer"/>
      </xsd:simpleType>
      <xsd:element name="a" type="valuelist"/>
    

    我想不出如何才能做到这一点:

    DECLARE @p0 AS XML
    SET @p0 = '<a>123 124</a>'
    select ??? from @p0.???
    

    这一个可以很好地工作,但它的开销是每个数字额外增加6个字符:

    DECLARE @p0 AS XML
    SET @p0 = '<b>123</b><b>124</b>'
    select T.c.value('.', 'int') as Id from @p0.nodes('/b') AS T(c)
    
    1 回复  |  直到 16 年前
        1
  •  1
  •   AdaTheDev    16 年前

    DECLARE @Schema XML
    SET @Schema = '<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <xs:element name="a">
        <xs:simpleType>
            <xs:list itemType="xs:int" />
        </xs:simpleType>
    </xs:element>
    </xs:schema>'
    
    CREATE XML SCHEMA COLLECTION exampleschema as @Schema;
    GO
    
    DECLARE @XmlDoc AS XML(exampleschema)
    SET @XmlDoc = '<a>123 456 789</a>'
    select T.ref.value('.', 'int')
    from 
    (
          select [Xml]=@XmlDoc.query('
                for $i in data(/a) return 
                element temp { $i }
            ')
    ) A
    CROSS APPLY A.Xml.nodes('/temp') T(ref)
    
    DROP XML SCHEMA COLLECTION exampleschema
    GO
    

    这几乎是从 this 演示该方法的MSDN博客。