使用 sql:relationship 指定關聯性 (SQLXML 4.0)
XML 檔中的專案可以相關。 元素可以以階層方式巢狀化,而且可以在專案之間指定ID、IDREF或IDREFS關聯性。
例如,在 XSD 架構中,<Customer> 元素包含< Order> 子元素。 當架構對應至 AdventureWorks 資料庫時,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> 元素:
名稱
指定關聯性的唯一名稱。
上層
指定父關聯性 (table)。 這是選擇性屬性;如果未指定 屬性,則會從檔中子階層中的資訊取得父數據表名稱。 如果架構指定兩個使用相同 sql:relationship 但不同父元素的父子式階層,您就不會在 sql:relationship>> 中<指定父屬性。< 此資訊是從架構中的階層取得。
parent-key
指定父代的父索引鍵。 如果父索引鍵是由多個數據行所組成,則會使用它們之間的空格來指定值。 針對多欄索引鍵和對應子索引鍵所指定的值之間,有一個位置對應。
孩子
指定子關聯性 (table)。
child-key
指定子系中參考父索引鍵的子索引鍵。 如果子索引鍵是由多個屬性(數據行)所組成,則子索引鍵值會以它們之間的空格來指定。 針對多欄索引鍵和對應父索引鍵所指定的值之間,會有位置對應。
逆
updategram 會使用在 sql:relationship> 上<指定的這個屬性。 如需詳細資訊,請參閱 在 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> 元素中。
關聯<>性元素會將 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 測試腳本 (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. 指定關聯性鏈結
在此範例中,假設您想要使用從 AdventureWorks 資料庫取得的數據來取得下列 XML 檔:
<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>,描述這兩個關聯性,會顯示為 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 測試腳本 (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> 元素會對應至 AdventureWorks 資料庫中的 Sales.Customer 數據表。 根據預設,除非在子專案或屬性上指定 sql:relation,否則此對應的範圍會套用至所有子專案或屬性,在此情況下,必須使用關聯性專案定義<適當的主鍵/外鍵關聯>性。 而使用關聯批註指定不同數據表的子專案或屬性也必須指定關聯性批注。
<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 測試腳本 (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 測試腳本 (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>
此範例說明指定不含父屬性的 <sql:relationship。> 例如,假設您有下列員工數據表:
Emp1(SalesPersonID, FirstName, LastName, ReportsTo)
Emp2(SalesPersonID, FirstName, LastName, ReportsTo)
下列 XML 檢視具有 Emp1 和 <Emp2> 元素對應至 Sales.Emp1> 和 Sales.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> 中<識別。 在此情況下,您不會在 sql:relationship> 中<指定父屬性;父屬性資訊是從架構中的階層取得。
若要針對架構測試範例 XPath 查詢
在 AdventureWorks 資料庫中建立這些資料表:
USE AdventureWorks2022; 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 測試腳本 (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>