首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> SQL Server 資料庫 >> 關於SqlServer

深入探討 SQL Server 2000 XML 支援:HTTP 存取、FOR XML、OPENXML、XPath、XDR Schema 完整指南

     編輯:關於SqlServer

引言:為何需要原生 XML 支援?

ADO 2.5 雖宣稱支援 XML,但仍需額外層轉換。SQL Server 2000 可直接從資料庫輸出 XML,消除中間程式碼層,大幅提升分散式、資料集中型應用效能。

SQL Server 2000 XML 核心新功能

  1. HTTP 直接存取 SQL Server:透過 IIS 虛擬目錄以 URL 執行查詢。
  2. XDR Schema 與 XPath 查詢:定義 XML 對應關係,支援 XPath 查詢語言。
  3. XML 資料擷取與寫入:
    • SELECT ... FOR XML 子句輸出 XML。
    • OPENXML 資料列集提供者將 XML 寫入資料庫。
    • XPath 查詢語言擷取 XML。
  4. 增強 SQLOLEDB 提供者:命令文字可為 XML 文件,結果集以串流形式傳回。

一、設定 IIS 虛擬目錄(SQL XML 支援精靈)

  1. 「SQL Server 工具」→「在 IIS 中設定 SQL XML 支援」。
  2. 展開伺服器 → 預設網站右鍵 → 新增 → 虛擬目錄(如 Northwind)。
  3. 常規頁籤:虛擬目錄名稱、實體路徑(如 C:\Inetpub\Wwwroot\Northwind)。
  4. 安全性頁籤:填入有效 SQL Server 登入帳密。
  5. 資料來源頁籤:SQL Server 名稱、預設資料庫(Northwind)。
  6. 設定頁籤:勾選「允許 URL 查詢」、「允許範本查詢」、「允許 XPath」、「允許 POST」。
  7. 虛擬名稱頁籤:新增範本、結構描述、dbobject 類型虛擬名稱及對應路徑。

程式碼建立虛擬目錄範例(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

二、HTTP 執行 SQL 查詢(FOR XML AUTO/RAW/ELEMENTS)

瀏覽器輸入: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=名稱:指定根元素名稱。

三、XML 範本查詢:安全與參數化

為防止使用者直接在 URL 執行任意 SQL(含 INSERT/UPDATE/DELETE),停用「允許 URL 查詢」,改用 XML 範本:

  1. 虛擬目錄設定 → 新增虛擬名稱類型 template 指向實體資料夾(如 C:\Inetpub\wwwroot\XML\templates)。
  2. 建立範本檔(如 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 對應

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 將於後續文章探討。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved