Creating Constant Elements Using sql:is-constant [SQLXML 4.0]

To specify a constant element—that is, an element in the XSD schema that does not map to any database table or column—you can use the sql:is-constant annotation. This annotation takes a Boolean value (0 = false, 1 = true). The acceptable values are 0, 1, true, and false. The sql:is-constant annotation can be specified on an element that does not have any attributes. If it is specified on an element with the value true (or 1), that element is not mapped to the database but still appears in the XML document.

The sql:is-constant annotation can be used for:

  • Adding a top-level element to the XML document. XML requires a single top-level element (root element) for the document.
  • Creating container elements, such as an <Orders> element that wraps all orders.

The sql:is-constant annotation can be added to a <complexType> element.

Examples

To create working samples using the following examples, you must meet certain requirements. For more information, see Requirements for Running SQLXML Examples.

A. Specifying sql:is-constant to add a container element

In this annotated XSD schema, <CustomerOrders> is defined as a constant element by specifying the sql:is-constant attribute with a value of 1. Therefore, <CustomerOrders> is not mapped to any database table or column. This constant element consists of the <Order> child elements.

Although <CustomerOrders> does not map to any database table or column, it still appears in the resulting XML as a container element containing the <Order> child elements.

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
            xmlns:sql="urn:schemas-microsoft-com:mapping-schema">
<xsd:annotation>
  <xsd:appinfo>
    <sql:relationship name="CustOrders"
        parent="Sales.Customer"
        parent-key="CustomerID"
        child="Sales.SalesOrderHeader"
        child-key="CustomerID" />
  </xsd:appinfo>
</xsd:annotation>

  <xsd:element name="Customer" sql:relation="Sales.Customer" >
   <xsd:complexType>
     <xsd:sequence>
        <xsd:element name="CustomerOrders" sql:is-constant="1" >
          <xsd:complexType>
            <xsd:sequence>
              <xsd:element name="Order" sql:relation="Sales.SalesOrderHeader"
                           sql:relationship="CustOrders" 
                           maxOccurs="unbounded" >
                <xsd:complexType>
                   <xsd:attribute name="SalesOrderID" type="xsd:integer" />
                   <xsd:attribute name="OrderDate" type="xsd:date" />
                   <xsd:attribute name="CustomerID" type="xsd:string" />
                </xsd:complexType>
              </xsd:element>
            </xsd:sequence>
           </xsd:complexType>
          </xsd:element>
         </xsd:sequence>
          <xsd:attribute name="CustomerID" type="xsd:string" />
     </xsd:complexType>
  </xsd:element>
</xsd:schema>

To test a sample XPath query against the schema

  1. Copy the schema code above and paste it into a text file. Save the file as isConstant.xml.

  2. Copy the following template and paste it into a text file. Save the file as isConstantT.xml in the same directory where you saved isConstant.xml.

    <ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql">
        <sql:xpath-query mapping-schema="isConstant.xml">
            Customer[@CustomerID=1]
        </sql:xpath-query>
    </ROOT>
    

    The directory path specified for the mapping schema (isConstant.xml) is relative to the directory where the template is saved. An absolute path also can be specified, for example:

    mapping-schema="C:\MyDir\isConstant.xml"
    
  3. Create and use the SQLXML 4.0 Test Script (Sqlxml4test.vbs) to execute the template.

    For more information, see Using ADO to Execute SQLXML Queries.

This is the partial result set:

<ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql"> 
<Customer CustomerID="1"> 
  <CustomerOrders> 
    <Order SalesOrderID="43860" OrderDate="2001-08-01" CustomerID="1" /> 
    <Order SalesOrderID="44501" OrderDate="2001-11-01" CustomerID="1" /> 
    <Order SalesOrderID="45283" OrderDate="2002-02-01" CustomerID="1" /> 
    <Order SalesOrderID="46042" OrderDate="2002-05-01" CustomerID="1" /> 
    ...
  </CustomerOrders> 
</Customer> 
</ROOT>