sql:relationship を使用した、リレーションシップの指定 (SQLXML 4.0)
XML ドキュメント内の要素は関連付けることができます。要素は階層的に入れ子にでき、要素間に ID、IDREF、または IDREFS のリレーションシップを指定することができます。
たとえば、XSD スキーマで、<Customer> 要素に <Order> 子要素が含まれているとします。このスキーマを AdventureWorks2008R2 データベースにマップすると、<Customer> 要素は Sales.Customer テーブルにマップされ、<Order> 要素は Sales.SalesOrderHeader テーブルにマップされます。これらの基になる Sales.Customer および Sales.SalesOrderHeader テーブルの間には、顧客 (Customer) が注文 (Order) するという関係があります。ここで、Sales.SalesOrderHeader テーブル内の CustomerID は、Sales.Customer テーブル内の CustomerID 主キーを参照する外部キーです。マッピング スキーマで要素間のリレーションシップを設定するには、sql:relationship 注釈を使用します。
注釈付き XSD スキーマでは、sql:relationship 注釈を使用して、要素のマップ先テーブルにおける主キーと外部キーのリレーションシップを基にスキーマ要素を階層的に入れ子にできます。sql:relationship 注釈を指定するときには、次を指定する必要があります。
親テーブル (Sales.Customer) と子テーブル (Sales.SalesOrderHeader)。
親テーブルと子テーブル間のリレーションシップを構成する列。たとえば、親テーブルと子テーブル両方にある CustomerID 列を指定します。
これらの情報を使用して、適切な階層が生成されます。
テーブル名と必要な結合情報を指定するには、sql:relationship 注釈に次の属性を指定します。これらの属性は、<sql:relationship> 要素でのみ有効です。
Name
リレーションシップの一意な名前を指定します。Parent
親リレーション (テーブル) を指定します。これは省略可能な属性です。この属性を指定しない場合、親テーブル名はドキュメント内の子階層の情報から取得されます。スキーマの 1 つの <sql:relationship> で、親要素が異なる 2 つの親子階層を指定する場合、<sql:relationship> に親属性は指定しません。この情報はスキーマ内の階層から取得されます。parent-key
親の親キーを指定します。親キーが複数の列で構成される場合は、値をスペースで区切って指定します。複数列キーに指定される値と、それに対応する子キーに指定される値の間では、位置的なマッピングが行われます。Child
子リレーション (テーブル) を指定します。child-key
親の parent-key を参照する子の、子キーを指定します。子キーが複数の属性 (列) で構成される場合、child-key の値は、スペースで区切って指定します。複数列キーに指定される値と、それに対応する親キーに指定される値の間では、位置的なマッピングが行われます。Inverse
<sql:relationship> のこの属性は、アップデートグラムで使用されます。詳細については、「sql:relationship での sql:inverse 属性の指定 [SQLXML 4.0]」を参照してください。
要素に子要素が含まれ、要素と子要素の間に <sql:relationship> が定義されていても、親要素に指定されているテーブルの主キーが <sql:relationship> で提供されない場合は、要素内に sql:key-fields を指定する必要があります。スキーマで <sql:relationship> を指定しない場合でも、適切な階層を生成するには sql:key-fields を指定する必要があります。詳細については、「sql:key-fields を使用した、キー列の指定 [SQLXML 4.0]」を参照してください。
結果内に適切な入れ子を生成するには、すべてのスキーマで sql:key-fields を指定することをお勧めします。
例
次の例を使用した実際のサンプルを作成するには、特定の条件を満たす必要があります。詳細については、「SQLXML のサンプル実行のための必要条件」を参照してください。
A. 要素に sql:relationship 注釈を指定する
次の注釈付き XSD スキーマには <Customer> と <Order> 要素が含まれています。<Order> 要素は <Customer> 要素の子要素です。
スキーマでは、<Order> 子要素に sql:relationship 注釈が指定されています。リレーションシップ自体は <xsd:appinfo> 要素で定義されています。
<relationship> 要素では、Sales.SalesOrderHeader テーブルの CustomerID が、Sales.Customer テーブルの CustomerID 主キーを参照する外部キーとして指定されています。したがって、顧客の注文は、<Customer> 要素の子要素として表されます。
<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" type="CustomerType" />
<xsd:complexType name="CustomerType" >
<xsd:sequence>
<xsd:element name="Order"
sql:relation="Sales.SalesOrderHeader"
sql:relationship="CustOrders" >
<xsd:complexType>
<xsd:attribute name="SalesOrderID" type="xsd:integer" />
<xsd:attribute name="CustomerID" type="xsd:string" />
</xsd:complexType>
</xsd:element>
</xsd:sequence>
<xsd:attribute name="CustomerID" type="xsd:string" />
</xsd:complexType>
</xsd:schema>
上のスキーマでは名前付きリレーションシップを使用しましたが、名前のないリレーションシップを指定することもできます。この結果は同じです。
次は、スキーマを変更し、名前のないリレーションシップを指定した例です。
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:sql="urn:schemas-microsoft-com:mapping-schema">
<xsd:element name="Customer" sql:relation="Sales.Customer" type="CustomerType" />
<xsd:complexType name="CustomerType" >
<xsd:sequence>
<xsd:element name="Order"
sql:relation="Sales.SalesOrderHeader">
<xsd:annotation>
<xsd:appinfo>
<sql:relationship
parent="Sales.Customer"
parent-key="CustomerID"
child="Sales.SalesOrderHeader"
child-key="CustomerID" />
</xsd:appinfo>
</xsd:annotation>
<xsd:complexType>
<xsd:attribute name="SalesOrderID" type="xsd:integer" />
<xsd:attribute name="CustomerID" type="xsd:string" />
</xsd:complexType>
</xsd:element>
</xsd:sequence>
<xsd:attribute name="CustomerID" type="xsd:string" />
</xsd:complexType>
</xsd:schema>
スキーマに対してサンプル XPath クエリをテストするには
上のスキーマのコードをコピーして、テキスト ファイルに貼り付け、sql-relationship.xml として保存します。
次のテンプレートをコピーして、テキスト ファイルに貼り付け、sql-relationship.xml を保存したディレクトリに sql-relationshipT.xml として保存します。
<ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql"> <sql:xpath-query mapping-schema="sql-relationship.xml"> /Customer[@CustomerID=1] </sql:xpath-query> </ROOT>
マッピング スキーマ (sql-relationship.xml) に指定するディレクトリ パスは、テンプレートを保存するディレクトリに対する相対パスです。次のように、絶対パスを指定することもできます。
mapping-schema="C:\MyDir\sql-relationship.xml"
SQLXML 4.0 テスト スクリプト (sqlxml4test.vbs) を作成し、それを使用してテンプレートを実行します。
詳細については、「ADO を使用した SQLXML クエリの実行」を参照してください。
次に結果セットを示します。
<ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql">
<Customer CustomerID="1">
<Order OrderID="43860" CustomerID="1" />
<Order OrderID="44501" CustomerID="1" />
<Order OrderID="45283" CustomerID="1" />
<Order OrderID="46042" CustomerID="1" />
</Customer>
</ROOT>
B. リレーションシップ チェーンを指定する
この例では、AdventureWorks2008R2 データベースから取得したデータを使用して、次の XML ドキュメントを要求するとします。
<Order SalesOrderID="43659">
<Product Name="Mountain Bike Socks, M"/>
<Product Name="Sport-100 Helmet, Blue"/>
...
</Order>
...
XML ドキュメントには、Sales.SalesOrderHeader テーブル内の注文ごとに 1 つの <Order> 要素が含まれています。各 <Order> 要素には、注文した製品ごとに 1 つずつ、<Product> 子要素が含まれています。
この階層を生成する XSD スキーマを指定するには、OrderOD と ODProduct の 2 つのリレーションシップを指定する必要があります。OrderOD リレーションシップでは、Sales.SalesOrderHeader テーブルと Sales.SalesOrderDetail テーブル間の親子リレーションシップを指定します。ODProduct リレーションシップでは、Sales.SalesOrderDetail テーブルと Production.Product テーブル間のリレーションシップを指定します。
次のスキーマでは、<Product> 要素に msdata:relationship 注釈が指定され、OrderOD と ODProduct の 2 つの値が指定されています。これらの値の指定順序は重要です。
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:msdata="urn:schemas-microsoft-com:mapping-schema">
<xsd:annotation>
<xsd:appinfo>
<msdata:relationship name="OrderOD"
parent="Sales.SalesOrderHeader"
parent-key="SalesOrderID"
child="Sales.SalesOrderDetail"
child-key="SalesOrderID" />
<msdata:relationship name="ODProduct"
parent="Sales.SalesOrderDetail"
parent-key="ProductID"
child="Production.Product"
child-key="ProductID" />
</xsd:appinfo>
</xsd:annotation>
<xsd:element name="Order" msdata:relation="Sales.SalesOrderHeader"
msdata:key-fields="SalesOrderID" type="OrderType" />
<xsd:complexType name="OrderType" >
<xsd:sequence>
<xsd:element name="Product" msdata:relation="Production.Product"
msdata:key-fields="ProductID"
msdata:relationship="OrderOD ODProduct">
<xsd:complexType>
<xsd:attribute name="Name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
</xsd:sequence>
<xsd:attribute name="SalesOrderID" type="xsd:integer" />
</xsd:complexType>
</xsd:schema>
名前付きリレーションシップを指定する代わりに、匿名のリレーションシップを指定することもできます。この場合、2 つのリレーションシップを記述する <annotation> から </annotation> までのコンテンツ全体が、<Product> の子要素として表示されます。
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:msdata="urn:schemas-microsoft-com:mapping-schema">
<xsd:element name="Order" msdata:relation="Sales.SalesOrderHeader"
msdata:key-fields="SalesOrderID" type="OrderType" />
<xsd:complexType name="OrderType" >
<xsd:sequence>
<xsd:element name="Product" msdata:relation="Production.Product"
msdata:key-fields="ProductID" >
<xsd:annotation>
<xsd:appinfo>
<msdata:relationship
parent="Sales.SalesOrderHeader"
parent-key="SalesOrderID"
child="Sales.SalesOrderDetail"
child-key="SalesOrderID" />
<msdata:relationship
parent="Sales.SalesOrderDetail"
parent-key="ProductID"
child="Production.Product"
child-key="ProductID" />
</xsd:appinfo>
</xsd:annotation>
<xsd:complexType>
<xsd:attribute name="Name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
</xsd:sequence>
<xsd:attribute name="SalesOrderID" type="xsd:integer" />
</xsd:complexType>
</xsd:schema>
スキーマに対してサンプル XPath クエリをテストするには
上のスキーマのコードをコピーして、テキスト ファイルに貼り付け、relationshipChain.xml として保存します。
次のテンプレートをコピーして、テキスト ファイルに貼り付け、relationshipChain.xml を保存したディレクトリに relationshipChainT.xml として保存します。
<ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql"> <sql:xpath-query mapping-schema="relationshipChain.xml"> /Order </sql:xpath-query> </ROOT>
マッピング スキーマ (relationshipChain.xml) に指定するディレクトリ パスは、テンプレートを保存するディレクトリに対する相対パスです。次のように、絶対パスを指定することもできます。
mapping-schema="C:\MyDir\relationshipChain.xml"
SQLXML 4.0 テスト スクリプト (sqlxml4test.vbs) を作成し、それを使用してテンプレートを実行します。
詳細については、「ADO を使用した SQLXML クエリの実行」を参照してください。
次に結果セットを示します。
<ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql">
<Order SalesOrderID="43659">
<Product Name="Mountain Bike Socks, M" />
<Product Name="Sport-100 Helmet, Blue" />
<Product Name="AWC Logo Cap" />
<Product Name="Long-Sleeve Logo Jersey, M" />
<Product Name="Long-Sleeve Logo Jersey, XL" />
...
</Order>
...
</ROOT>
C. 属性にリレーションシップ注釈を指定する
この例のスキーマでは、<Customer> 要素に <CustomerID> 子要素と IDREFS 型の OrderIDList 属性が含まれています。<Customer> 要素は、AdventureWorks2008R2 データベースの Sales.Customer テーブルにマップされます。既定では、このマッピングのスコープは、子要素または属性に sql:relation が指定されない限りすべての子要素または属性に適用されます。子要素または属性に sql:relation を指定する場合は、<relationship> 要素を使って適切な主キー/外部キー リレーションシップを定義する必要があります。子要素または属性で relation 注釈を使って異なるテーブルを指定する場合は、relationship 注釈も指定する必要があります。
<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" type="CustomerType" />
<xsd:complexType name="CustomerType" >
<xsd:sequence>
<xsd:element name="CustomerID" type="xsd:string" />
</xsd:sequence>
<xsd:attribute name="OrderIDList"
type="xsd:IDREFS"
sql:relation="Sales.SalesOrderHeader"
sql:field="SalesOrderID"
sql:relationship="CustOrders" >
</xsd:attribute>
</xsd:complexType>
</xsd:schema>
スキーマに対してサンプル XPath クエリをテストするには
上のスキーマのコードをコピーして、テキスト ファイルに貼り付け、relationship-on-attribute.xml として保存します。
次のテンプレートをコピーして、ファイルに貼り付け、relationship-on-attribute.xml を保存したディレクトリに relationship-on-attributeT.xml として保存します。このテンプレートのクエリでは、CustomerID が 1 の顧客が選択されます。
<ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql"> <sql:xpath-query mapping-schema="relationship-on-attribute.xml"> /Customer[CustomerID=1] </sql:xpath-query> </ROOT>
マッピング スキーマ (relationship-on-attribute.xml) に指定するディレクトリ パスは、テンプレートを保存するディレクトリに対する相対パスです。次のように、絶対パスを指定することもできます。
mapping-schema="C:\MyDir\relationship-on-attribute.xml"
SQLXML 4.0 テスト スクリプト (sqlxml4test.vbs) を作成し、それを使用してテンプレートを実行します。
詳細については、「ADO を使用した SQLXML クエリの実行」を参照してください。
次に結果セットを示します。
<ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql">
<Customer OrderIDList="43860 44501 45283 46042">
<CustomerID>1</CustomerID>
</Customer>
</ROOT>
D. 複数の要素に sql:relationship を指定する
この例では、注釈付き XSD スキーマに <Customer>、<Order>、および <OrderDetail> 要素が含まれています。
<Order> 要素は <Customer> 要素の子要素であり、<Order> 子要素に <sql:relationship> が指定されています。したがって、顧客の注文は <Customer> の子要素として表されます。
<Order> 要素には <OrderDetail> 子要素が含まれており、<OrderDetail> 子要素に <sql:relationship> が指定されています。したがって、注文の詳細は <Order> 要素の子要素として表されます。
<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" />
<sql:relationship name="OrderOrderDetail"
parent="Sales.SalesOrderHeader"
parent-key="SalesOrderID"
child="Sales.SalesOrderDetail"
child-key="SalesOrderID" />
</xsd:appinfo>
</xsd:annotation>
<xsd:element name="Customer" sql:relation="Sales.Customer" >
<xsd:complexType>
<xsd:sequence>
<xsd:element name="Order" sql:relation="Sales.SalesOrderHeader"
sql:relationship="CustOrders" maxOccurs="unbounded" >
<xsd:complexType>
<xsd:sequence>
<xsd:element name="OrderDetail"
sql:relation="Sales.SalesOrderDetail"
sql:relationship="OrderOrderDetail"
maxOccurs="unbounded" >
<xsd:complexType>
<xsd:attribute name="SalesOrderID" type="xsd:integer" />
<xsd:attribute name="ProductID" type="xsd:string" />
<xsd:attribute name="OrderQty" type="xsd:integer" />
</xsd:complexType>
</xsd:element>
</xsd:sequence>
<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:attribute name="CustomerID" type="xsd:string" />
</xsd:complexType>
</xsd:element>
</xsd:schema>
スキーマに対してサンプル XPath クエリをテストするには
上のスキーマのコードをコピーして、テキスト ファイルに貼り付け、relationship-multiple-elements.xml として保存します。
次のテンプレートをコピーして、テキスト ファイルに貼り付け、relationship-multiple-elements.xml を保存したディレクトリに relationship-multiple-elementsT.xml として保存します。このテンプレート内のクエリでは、CustomerID が 1、SalesOrderID が 43860 の顧客の注文情報が返されます。
<ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql"> <sql:xpath-query mapping-schema="relationship-multiple-elements.xml"> /Customer[@CustomerID=1]/Order[@SalesOrderID=43860] </sql:xpath-query> </ROOT>
マッピング スキーマ (relationship-multiple-elements.xml) に指定するディレクトリ パスは、テンプレートを保存するディレクトリに対する相対パスです。次のように、絶対パスを指定することもできます。
mapping-schema="C:\MyDir\relationship-multiple-elements.xml"
SQLXML 4.0 テスト スクリプト (sqlxml4test.vbs) を作成し、それを使用してテンプレートを実行します。
詳細については、「ADO を使用した SQLXML クエリの実行」を参照してください。
次に結果セットを示します。
<ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql">
<Order SalesOrderID="43860" OrderDate="2001-08-01" CustomerID="1">
<OrderDetail SalesOrderID="43860" ProductID="761" OrderQty="2" />
<OrderDetail SalesOrderID="43860" ProductID="770" OrderQty="1" />
<OrderDetail SalesOrderID="43860" ProductID="758" OrderQty="2" />
<OrderDetail SalesOrderID="43860" ProductID="765" OrderQty="2" />
<OrderDetail SalesOrderID="43860" ProductID="732" OrderQty="1" />
<OrderDetail SalesOrderID="43860" ProductID="762" OrderQty="1" />
<OrderDetail SalesOrderID="43860" ProductID="738" OrderQty="1" />
<OrderDetail SalesOrderID="43860" ProductID="768" OrderQty="1" />
<OrderDetail SalesOrderID="43860" ProductID="753" OrderQty="2" />
<OrderDetail SalesOrderID="43860" ProductID="729" OrderQty="1" />
<OrderDetail SalesOrderID="43860" ProductID="763" OrderQty="1" />
<OrderDetail SalesOrderID="43860" ProductID="756" OrderQty="1" />
</Order>
</ROOT>
E. 親属性なしで <sql:relationship> を指定する
この例では、parent 属性なしで <sql:relationship> を指定する場合を示します。たとえば、次の従業員テーブルがあるとします。
Emp1(SalesPersonID, FirstName, LastName, ReportsTo)
Emp2(SalesPersonID, FirstName, LastName, ReportsTo)
次の XML ビューには、Sales.Emp1 および Sales.Emp2 テーブルにマップされる <Emp1> と <Emp2> という要素があります。
<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="EmpOrders"
parent-key="SalesPersonID"
child="Sales.SalesOrderHeader"
child-key="SalesPersonID" />
</xsd:appinfo>
</xsd:annotation>
<xsd:element name="Emp1" sql:relation="Sales.Emp1" type="EmpType" />
<xsd:element name="Emp2" sql:relation="Sales.Emp2" type="EmpType" />
<xsd:complexType name="EmpType" >
<xsd:sequence>
<xsd:element name="Order"
sql:relation="Sales.SalesOrderHeader"
sql:relationship="EmpOrders" >
<xsd:complexType>
<xsd:attribute name="SalesOrderID" type="xsd:integer" />
<xsd:attribute name="CustomerID" type="xsd:string" />
</xsd:complexType>
</xsd:element>
</xsd:sequence>
<xsd:attribute name="SalesPersonID" type="xsd:integer" />
<xsd:attribute name="LastName" type="xsd:string" />
</xsd:complexType>
</xsd:schema>
このスキーマでは、<Emp1> 要素と <Emp2> 要素は両方とも EmpType 型です。EmpType 型では、<Order> 子要素と、対応する <sql:relationship> が記述されています。この場合、<sql:relationship> で parent 属性を使って指定できる単一の親はありません。このようなとき、<sql:relationship> は parent 属性は指定しません。parent 属性情報はスキーマ内の階層から取得されます。
スキーマに対してサンプル XPath クエリをテストするには
AdventureWorks2008R2 データベース内に次のテーブルを作成します。
USE AdventureWorks2008R2; GO CREATE TABLE Sales.Emp1 ( SalesPersonID int primary key, FirstName varchar(20), LastName varchar(20), ReportsTo int) Go CREATE TABLE Sales.Emp2 ( SalesPersonID int primary key, FirstName varchar(20), LastName varchar(20), ReportsTo int) Go
テーブルに次のサンプル データを追加します。
INSERT INTO Sales.Emp1 values (279, 'Nancy', 'Devolio',NULL); INSERT INTO Sales.Emp1 values (282, 'Andrew', 'Fuller',1); INSERT INTO Sales.Emp1 values (276, 'Janet', 'Leverling',1); INSERT INTO Sales.Emp2 values (277, 'Margaret', 'Peacock',3); INSERT INTO Sales.Emp2 values (283, 'Steven', 'Devolio',4); INSERT INTO Sales.Emp2 values (275, 'Nancy', 'Buchanan',5); INSERT INTO Sales.Emp2 values (281, 'Michael', 'Suyama',6);
上のスキーマのコードをコピーして、テキスト ファイルに貼り付け、relationship-noparent.xml として保存します。
次のテンプレートをコピーして、テキスト ファイルに貼り付け、relationship-noparent.xml を保存したディレクトリに relationship-noparentT.xml として保存します。このテンプレートのクエリでは、すべての <Emp1> 要素が選択されます (したがって、親は Emp1 です)。
<ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql"> <sql:xpath-query mapping-schema="relationship-noparent.xml"> /Emp1 </sql:xpath-query> </ROOT>
マッピング スキーマ (relationship-noparent.xml) に指定するディレクトリ パスは、テンプレートを保存するディレクトリに対する相対パスです。次のように、絶対パスを指定することもできます。
mapping-schema="C:\MyDir\relationship-noparent.xml"
SQLXML 4.0 テスト スクリプト (sqlxml4test.vbs) を作成し、それを使用してテンプレートを実行します。
詳細については、「ADO を使用した SQLXML クエリの実行」を参照してください。
次に結果セットの一部を示します。
<ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql">
<Emp1 SalesPersonID="276" LastName="Leverling">
<Order SalesOrderID="43663" CustomerID="510" />
<Order SalesOrderID="43666" CustomerID="511" />
<Order SalesOrderID="43859" CustomerID="259" />
...
</Emp1>