程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> SqlServer數據庫 >> 關於SqlServer >> SQLServer2000的XML集成

SQLServer2000的XML集成

編輯:關於SqlServer

使用

1、首先,我們有必要先了解一下使用哪些T-SQL語句可以把數據轉換成XML格式。
  select * from table1
  [for xml {raw|auto|explicit}[,XMLdata][,elements][,binary base64]]
  [option(<query hint>,[,...n])]

  這裡不再說明DML語句的用法,請注意for xml選項,這裡重點討論for XML。
  (以下例子均使用NorthWind數據庫)

  [raw] 該選項將結果集中的每一行數據返回為單個數據元素,同時存在元素row,而且每一列將作為row元素的屬性列出。試著執行 select CompanyName from Customers 與 select CompanyName from Customers for XML raw,就可以發現結果集的列作為row元素的屬性被輸出,列的值作為屬性的值,且每一行記錄都是一個單獨的元素。

  [auto] 該選項用表明數據來源的表名或表別名標記每一個元素。如果查詢中的數據不止輸出一張表,那麼來源於每張表的數據將被拆分成獨立的、嵌套的元素。試著執行 select CompanyName from Customers for XML auto 將會發現,輸出的結果與上一例差不多,不過row元素被換成了具體的表名。

  [explicit] 這當然是規定查詢格式的最復雜的選項,它能夠定義層次的每一層以及每一層將如何查看。為了定義層次,要創建一個內部的通用表,它通常通過UNION語句產生,然後在UNION生成的結果集後面加上for xml explicit 語句將其轉換成XML格式。

  在通用表中,必須包含兩個特殊列,tag(標記)和parent(父標記),tag是當前行的標識,而parent則指明了當前行屬於哪一行,即當前行的父結點是哪一行(如果有多個相同的tag,則當前行的父結點為上方最近的一個擁有該tag值的行)。
  而通用表中的其它列也必須使用特定的格式:<元素名>!<標記>![列名]。現在讓我們看個簡單的例子:
  Tag    parent    tablea!1!columna    tablea!1!columnb    tableb!2!columna    tableb!2!columnb
   1      null         BH1000              神州數碼              null                null
  當它查找標記時,看到的是1,因此知道它該處理tablea!1!columna和tablea!1!columnb這兩列,但是它不會處理tableb!2!columna和tableb!2!columnb,因為後兩列的標記不等於該行的標記,而父標記為空則說明該行的沒有父結點,知道了這個規則後,我們再看個復雜一點的例子:

 (select 1 as tag,null as parent,Employees.LastName as [Employees!1!LastName],
null as [EmployeeTerritories!2!TerritoryID] from Employees)
UNION ALL
(select 2,1,Employees.LastName,EmployeeTerritories.TerritoryID
from EmployeeTerritories join Employees on EmployeeTerritorIEs.EmployeeID=Employees.EmployeeID)
order by [Employees!1!LastName],tag
for XML explicit

  在查詢分析器中運行這條語句,可以發現,如果去掉最後的for xml explicit,那麼查詢出來的就是類似上一例簡單例子中顯示的結果集,而要使用explicit選項,首要的工作就是要生成如上的結果集,否則for XML語法將無法工作。注意order by語句,生成結果集的排序方式將直接影響輸出的結果。
  關於XML的語句只是簡單講下,如果有興趣可以查閱相關書籍。

2、如何通過HTTP訪問SQLServer2000
  在SQLServer中提供了一個設置HTTP訪問的工具,實際的訪問其實是通過WEB服務器上的虛擬目錄實現。
  a.打開開始菜單中[Microsoft SQL Server]下的[在 IIS 中配置 SQL XML 支持]工具,會出現一個類似IIS的窗口(系統中必須安裝了IIS)
  b.選擇[默認WEB站點](當然也可以是其它站點),在右邊窗口中新建[虛擬目錄]
  c.在[常規]頁面中輸入一個虛擬目錄名(這個名字就是你後面訪問時需要輸入的目錄名),指定本地路徑(要存放XML文件的地方,一般是該站點下的某個目錄)
  d.在[安全性]頁面中輸入你的SQL賬號密碼(注意:所有可以訪問該站點的用戶都擁有該賬戶的權限,因此建議新建一個只有部份權限的SQL賬戶)
  e.在[數據源]頁面選擇一個數據庫,例如Northwind
  f.在[設置]頁,這裡有5個選項,代表用戶可以執行的5種功能,我們先把第1,3兩個選擇勾選
  g.在[虛擬名稱]頁,這裡可以為設置頁面的選項指定訪問目錄,例如:我們在設置頁選擇了允許模板查詢選項,這裡就要新建一個template類型的目錄,在這個目錄裡可以存放XML模板。我們同時選擇了允許URL訪問,那麼也必須創建一個schema類型的目錄。另外數據庫對象dbobject目錄必須創建。
  h.高級選項不需要設置,完成後點擊確定,就生成了一個配置好的虛擬目錄了。

  現在,我們可以通過URL訪問數據庫了,在地址欄輸入 http://localhost/myserver?sql=select+*+from+customers+for+XML+auto&root=root
應該就可以看到輸出的XML文檔了。其中[myserver]是常規頁面中輸入的虛擬目錄名,[sql=]後面是SQL語句,空格要用+號代替,[root=]指定根目錄名,這裡是root,也可以換成其它名字。

  使用URL訪問數據庫非常簡單,但是也存在安全問題,所以這裡也提供了一種模板查詢方法,把下面的內容保存為file1.XML文件並存儲在[模板]虛擬目錄下。
  <root xmlns:sql="urn:schemas-microsoft-com:XML-sql">
    <sql:query>
      select * from customers for XML auto
    </sql:query>
  </root>
  然後通過http://localhost/myserver/template/file1.XML來訪問數據庫了。其中[template]為[虛擬名稱]頁輸入的template名稱,而file1.XML文件也就是存放在這個類指定的目錄中。

  即然是模板,那就一定支持參數的傳遞,下面給出一個參數化的模板,同樣也保存在[模板]目錄下。
  <root xmlns:sql="urn:schemas-microsoft-com:XML-sql">
    <sql:header>
      <sql:param name='lx'>
        pk
      </sql:param>
    </sql:header>
    <sql:query>
      select xtype,name from sysobjects where xtype='u' or xtype=@lx for XML auto
    </sql:query>
  </root>
  然後通過http://localhost/myserver/template/file2.XML?lx=p就可以訪問了,模板中的內容<sql:param name='lx'>中的lx是參數名,通過在SQL語句中引用@lx調用,pk是參數lx的默認值。URL中?lx=p就是指定lx參數的值為p。

  <sql:header></sql:header>元素中的每一個<sql:param name='參數名'>默認值</sql:param>代表一個參數,每一個<sql:query>SQL語句</sql:query>則代表一條查詢語句。只要保證只有一個根目錄,就可以運行任意的SQL語句,也可以調用EXEC執行存儲過程,前提是返回值必須是XML格式。3、關於XML的集成就介紹到這裡。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved