ADO 2.5 雖宣稱支援 XML,但仍需額外層轉換。SQL Server 2000 可直接從資料庫輸出 XML,消除中間程式碼層,大幅提升分散式、資料集中型應用效能。
SELECT ... FOR XML 子句輸出 XML。OPENXML 資料列集提供者將 XML 寫入資料庫。Northwind)。C:\Inetpub\Wwwroot\Northwind)。Northwind)。程式碼建立虛擬目錄範例(VBScript):
Set ObjXML = CreateObject("SQLVDir.SQLVDirControl")
ObjXML.Connect
Set ObjVDirs = ObjXML.SQLVDirs
Set ObjVDir = ObjVDirs.AddVirtualDirectory("Northwind")
ObjVDir.PhysicalPath = "C:\Inetpub\wwwroot\northwind"
ObjVDir.UserName = "wayne"
ObjVDir.PassWord = ""
ObjVDir.DatabaseName = "Northwind"
objVDir.AllowFlags = 73
Set objVNames = objVDir.VirtualNames
objVNames.AddVirtualName "dbobject", 1, ""
objVNames.AddVirtualName "schema", 2, "C:\Inetpub\wwwroot\northwind\schema"
objVNames.AddVirtualName "template", 4, "C:\Inetpub\wwwroot\northwind\template"
objXML.Disconnect
瀏覽器輸入:https://localhost/northwind?sql=SELECT+*+FROM+Customers+FOR+XML+AUTO&root=root
回傳 XML 片段:
<?xml version="1.0" encoding="utf-8"?>
<root>
<Customers CustomerID="ANTON" CompanyName="Antonio Moreno Taquería" ... />
</root>
關鍵字說明:
FOR XML AUTO:巢狀 XML 元素,每個資料表對應一個元素,欄位對應屬性(預設)。FOR XML RAW:每列轉為 <row .../> 元素,無巢狀結構。ELEMENTS 選項:欄位對應子元素而非屬性。root=名稱:指定根元素名稱。為防止使用者直接在 URL 執行任意 SQL(含 INSERT/UPDATE/DELETE),停用「允許 URL 查詢」,改用 XML 範本:
template 指向實體資料夾(如 C:\Inetpub\wwwroot\XML\templates)。file2.xml):<Northwind xmlns:sql="urn:schemas-microsoft-com:xml-sql">
<sql:header>
<sql:param name="CustomerID">A</sql:param>
</sql:header>
<sql:query>
SELECT Customers.CustomerID, Customers.ContactName, Orders.OrderID, Orders.CustomerID
FROM Customers INNER JOIN Orders ON Customers.CustomerID = Orders.CustomerID
WHERE Customers.CustomerID LIKE @CustomerID + '%'
FOR XML AUTO
</sql:query>
</Northwind>
呼叫:https://localhost/northwind/templates/file2.xml?CustomerID=B 即可動態傳參。
XPath 查詢需搭配 XDR Schema 將 XML 元素/屬性對應至資料表/欄位。
<Northwind xmlns:sql="urn:schemas-microsoft-com:xml-sql">
<sql:xpath-query mapping-schema="file4.xdr">
/Customer[@CustomerID='ALFKI']/Order
</sql:xpath-query>
</Northwind>
Schema 片段:
<Schema xmlns="urn:schemas-microsoft-com:xml-data"
xmlns:dt="urn:schemas-microsoft-com:datatypes"
xmlns:sql="urn:schemas-microsoft-com:xml-sql">
<ElementType name="Customer" sql:relation="Customers">
<AttributeType name="CustomerID" dt:type="id"/>
<attribute type="CustomerID"/>
<attribute type="Orders" dt:type="idrefs" sql:id-prefix="Ord-" sql:relation="Orders" sql:field="OrderID">
<sql:relationship key-relation="Customers" key="CustomerID" foreign-relation="Orders" foreign-key="CustomerID"/>
</attribute>
</ElementType>
<ElementType name="Order" sql:relation="Orders"> ... </ElementType>
</Schema>
XPath 範本亦支援參數($ID),URL 傳參方式相同。
SQL Server 2000 提供 URL 查詢、XML 範本、XDR Schema、XPath 多種原生 XML 存取路徑。進階主題如 FOR XML EXPLICIT、OPENXML 寫入 XML 將於後續文章探討。