使用For Xml子句从SQL Query构建Xml文档

时间:2012-05-27 05:54:19

标签: sql sql-server xml xsd schema

我正在使用AdventureWorks数据库,我想使用带有FOR XML子句的查询来构建xml块 但我需要在结果中指定特定的XML Schema以获得其数据类型等等。

e.g。此示例查询“已复制”

 SELECT e.EmployeeID, c.FirstName, c.MiddleName, c.LastName
 FROM HumanResources.Employee e INNER JOIN Person.Contact c
 ON c.ContactID = e.ContactID
 WHERE c.FirstName = 'Rob'
 FOR XML RAW ('Employee'), ROOT ('Employees'), ELEMENTS XSINIL, XMLSCHEMA; 

获得此结果

<Employees xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">

<xsd:schema targetNamespace="urn:schemas-microsoft-com:sql:SqlRowSet1" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:sqltypes="http://schemas.microsoft.com/sqlserver/2004/sqltypes" elementFormDefault="qualified">

    <xsd:import namespace="http://schemas.microsoft.com/sqlserver/2004/sqltypes" schemaLocation="http://schemas.microsoft.com/sqlserver/2004/sqltypes/sqltypes.xsd" />

    <xsd:element name="Employee">

      <xsd:complexType>

        <xsd:sequence>

          <xsd:element name="EmployeeID" type="sqltypes:int" nillable="1" />

          <xsd:element name="FirstName" nillable="1">

            <xsd:simpleType sqltypes:sqlTypeAlias="[AdventureWorks].[dbo].[Name]">

              <xsd:restriction base="sqltypes:nvarchar" sqltypes:localeId="1033" sqltypes:sqlCompareOptions="IgnoreCase IgnoreKanaType IgnoreWidth" sqltypes:sqlSortId="52">

                <xsd:maxLength value="50" />

              </xsd:restriction>

            </xsd:simpleType>

          </xsd:element>

          <xsd:element name="MiddleName" nillable="1">

            <xsd:simpleType sqltypes:sqlTypeAlias="[AdventureWorks].[dbo].[Name]">

              <xsd:restriction base="sqltypes:nvarchar" sqltypes:localeId="1033" sqltypes:sqlCompareOptions="IgnoreCase IgnoreKanaType IgnoreWidth" sqltypes:sqlSortId="52">

                <xsd:maxLength value="50" />

              </xsd:restriction>

            </xsd:simpleType>

          </xsd:element>

          <xsd:element name="LastName" nillable="1">

            <xsd:simpleType sqltypes:sqlTypeAlias="[AdventureWorks].[dbo].[Name]">

              <xsd:restriction base="sqltypes:nvarchar" sqltypes:localeId="1033" sqltypes:sqlCompareOptions="IgnoreCase IgnoreKanaType IgnoreWidth" sqltypes:sqlSortId="52">

                <xsd:maxLength value="50" />

              </xsd:restriction>

            </xsd:simpleType>

          </xsd:element>

        </xsd:sequence>

      </xsd:complexType>

    </xsd:element>

  </xsd:schema>

  <Employee xmlns="urn:schemas-microsoft-com:sql:SqlRowSet1">

    <EmployeeID>4</EmployeeID>

    <FirstName>Rob</FirstName>

    <MiddleName xsi:nil="true" />

    <LastName>Walters</LastName>

  </Employee>

  <Employee xmlns="urn:schemas-microsoft-com:sql:SqlRowSet1">

    <EmployeeID>168</EmployeeID>

    <FirstName>Rob</FirstName>

    <MiddleName>T</MiddleName>

    <LastName>Caron</LastName>

  </Employee>

</Employees>

我需要参考另一个在线模式..这可能吗?

感谢。

1 个答案:

答案 0 :(得分:1)

由于您需要查询遵守现有架构,我认为您应该使用例如EXPLICIT mode来自行控制生成的XML。在这种情况下,您不能使用XMLSCHEMA选项,但是没关系,因为您已经拥有自己的架构。