使用 sql:relationship 指定關聯性 (SQLXML 4.0)
XML 文件中的元素可以是相關聯的。元素可以是巢狀階層,而且在元素之間可以指定 ID、IDREF 或 IDREFS 關聯性。
例如,在 XSD 結構描述中,<Customer> 元素包含 <Order> 子元素。當結構描述對應到 AdventureWorks2008R2 資料庫時,<Customer> 元素會對應到 Sales.Customer 資料表,而 <Order> 元素會對應到 Sales.SalesOrderHeader 資料表。Sales.Customer 和 Sales.SalesOrderHeader 這些基礎資料表是相關聯的,因為客戶下了訂單。Sales.SalesOrderHeader 資料表中的 CustomerID 是外部索引鍵,參考 Sales.Customer 資料表中的 CustomerID 主索引鍵。您可以使用 sql:relationship 註解,建立對應結構描述元素之間的關聯性。
在註解式 XSD 結構描述中,會根據主索引鍵和基礎資料表之間元素所對應的外部索引鍵關聯性,使用 sql:relationship 註解以階層方式建立巢狀結構描述元素。指定 sql:relationship 註解時,您必須識別下列項目:
父資料表 (Sales.Customer) 和子資料表 (Sales.SalesOrderHeader)。
在父資料表和子資料表之間組成關聯性的一或多個資料行。例如,同時出現在父資料表和子資料表中的 CustomerID 資料行。
這項資訊用於產生適當的階層。
若要提供資料表名稱和需要的聯結資訊,則要在 sql:relationship 註解上指定下列屬性。這些屬性只對 <sql:relationship> 元素有效:
Name
指定關聯性的唯一名稱。Parent
指定父關聯 (資料表)。這是選用的屬性;如果未指定此屬性,會從文件之子階層中的資訊取得父資料表名稱。如果結構描述指定使用相同 <sql:relationship> 但不同父元素的兩個父子式階層,您就不用在 <sql:relationship> 中指定父屬性。這項資訊是從結構描述的階層中取得。parent-key
指定父系的父索引鍵。如果父索引鍵由多個資料行所組成,值就會用資料行之間的空格指定。在指定給多重資料行索引鍵和其對應之子索引鍵的值之間有位置性對應。Child
指定子關聯 (資料表)。child-key
在參考父系中之 parent-key 的子系中指定子索引鍵。如果子索引鍵由多個屬性 (資料行) 所組成,則 child-key 的值就會用屬性或資料行之間的空格指定。在指定給多重資料行索引鍵和其對應之父索引鍵的值之間有位置性對應。Inverse
在 <sql:relationship> 上指定的這個屬性是由 Updategrams 所使用。如需詳細資訊,請參閱<針對 sql:relationship 指定 sql:inverse 屬性>。
sql:key-fields 註解必須在包含子元素和 <sql:relationship> (在元素和子元素之間定義) 的元素中指定,而且不提供在父元素中指定的資料表主索引鍵。即使結構描述沒有指定 <sql:relationship>,您還是必須指定 sql:key-fields 來導入適當的階層。如需詳細資訊,請參閱<使用 sql:key-fields 來識別索引鍵資料行>。
若要在結果中產生正確的巢狀結構,建議在所有的結構描述中指定 sql:key-fields。
範例
若要使用下列範例建立工作範例,您必須符合某些需求。如需詳細資訊,請參閱<執行 SQLXML 範例的需求>。
A. 在元素上指定 sql:relationship 註解
下列註解式 XSD 結構描述包含 <Customer> 和 <Order> 元素。<Order> 元素是 <Customer> 元素的子元素。
在結構描述中,sql:relationship 註解會在 <Order> 子元素上指定。此關聯性本身會在 <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-relationshipT.xml 並放在與儲存 sql-relationship.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 Test Script (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. 指定關聯性鏈結
在這個範例中,假設您想要讓下列 XML 文件使用從 AdventureWorks2008R2 資料庫取得的資料:
<Order SalesOrderID="43659">
<Product Name="Mountain Bike Socks, M"/>
<Product Name="Sport-100 Helmet, Blue"/>
...
</Order>
...
針對 Sales.SalesOrderHeader 資料表中的每個訂單,XML 文件都有一個 <Order> 元素。而且每個 <Order> 元素都有一個 <Product> 子元素的清單,在訂單中要求的每個項目都有一個。
若要指定產生此階層的 XSD 結構描述,您必須指定兩個關聯性:OrderOD 和 ODProduct。OrderOD 關聯性會在 Sales.SalesOrderHeader 和 Sales.SalesOrderDetail 資料表之間指定父子式關聯性。ODProduct 關聯性會在 Sales.SalesOrderDetail 和 Production.Product 資料表之間指定關聯性。
在下列結構描述中,<Product> 元素上的 msdata:relationship 註解會指定兩個值:OrderOD 和 ODProduct。指定這些值的順序很重要。
<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>
您可以指定匿名關聯性,而非指定具名關聯性。在此情況下,描述這兩個關聯性的 <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。
複製下列範本,並將其貼到文字檔中。然後將檔案儲存為 relationshipChainT.xml,並放在與儲存 relationshipChain.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 Test Script (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. 在屬性上指定關聯性註解
此範例中的結構描述包含具有 <CustomerID> 子元素的 <Customer> 元素,以及 IDREFS 類型的 OrderIDList 屬性。<Customer> 元素會對應到 AdventureWorks2008R2 資料庫中的 Sales.Customer 資料表。根據預設,除非在子元素或屬性上指定 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-attributeT.xml,並放在與儲存 relationship-on-attribute.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 Test Script (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> 元素的子元素。<sql:relationship> 是在 <Order> 子元素中所指定,因此,客戶的訂單會顯示為 <Customer> 的子元素。
<Order> 元素包括 <OrderDetail> 子元素。<sql:relationship> 是在 <OrderDetail> 子元素中所指定,因此,訂單的訂單詳細資料會顯示為該 <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-elementsT.xml,並放在與儲存 relationship-multiple-elements.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 Test Script (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. 指定沒有 parent 屬性的 <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>。在此情況下,沒有可以使用 parent 屬性在 <sql:relationship> 中識別的單一父系。在此情況下,您不用在 <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-noparentT.xml,並放在與儲存 relationship-noparent.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 Test Script (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>