使用
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的集成就介紹到這裡。