一
建立訪問SQL Server
的虛擬目錄
在通過HTTP訪問SQL Server
數據庫之前
你必須設置一個適當的虛擬目錄
利用SQL Server工具集中IIS虛擬目錄管理器 (在SQL Server Tools程序組中點擊Configure SQL XML Support啟動該工具)在運行IIS的機器上定義並注冊一個新的虛擬目錄
該工具指導IIS在虛擬目錄與SQL Server實例之間建立關聯
IIS 服務器的名字與虛擬目錄必須作為URL的一部分
虛擬目錄的信息(包括登錄名
口令和訪問權限)用於建立與指定數據庫的連接並執行查詢
URL可被定義為
直接訪問數據庫對象
例如表
執行模板文件
執行XPath查詢
建立XML虛擬目錄示例
該示例演示建立一個訪問SQL Server
的IIS虛擬目錄的全過程
在Microsoft SQL Server程序組點擊Configure SQL XML Support in IIS
展開一個服務器
然後點擊一個WEB站點
在選擇的WEB站點上單擊右鍵
將鼠標移至
新建(N)
點擊
Virtual Directory
在New Virtual Directory Properties的General頁輸入虛擬目錄名
在此例中
輸入XML及物理路徑 (例如C
\Interpub\Wwwroot\xml
假設你已在C
\Interpub\Wwwroot目錄中建立xml子目錄)
你也可使用Browse按鈕選擇一個目錄
在Security頁
選擇SQL Server並輸入合法的SQL Server登錄信息
在Data Source頁
在SQL Server框中
輸入服務器名
例如
(local)
當服務器上存在多個SQL Server實例時
還需指定實例名
在Database框
輸入默認數據庫名
如test
假如你的服務器上有這個名稱的數據庫
在Settings頁
選擇Allow URL queries
Allow template queries
Allow XPath及Allow POST選項
在Virtual Names頁
點擊New為template(模板)建立虛擬目錄
在Virtual Name Configuration對話框的Virtual name框中輸入template(或其他名字)
在Type列表 中
選擇template
輸入路徑(例如
C:\Inetpub\Wwwroot\xml\template
假設已建立該目錄
)點擊Save保存虛擬目錄名
其他類型如object
schema的虛擬目錄建立同上
點擊O 4嫔柚謾?
如此
建立了一個xml虛擬目錄
為測試該虛擬目錄
浏覽器地址欄輸入
//$#@
;IISServer$#@
;/xml?sql=SELECT*FROM+Sysobjects+WHERE+xtype=
u
+FOR+XML+AUTO&root=root並回車
注意
為防止不希望的訪問
建議為該目錄建立一個專門的SQL Server登錄帳號
並取消該帳號所有不必要的權限
尤其是DELETE
DROP
CREATE PROC權限
最好禁止在該虛擬目錄直接執行SQL語句
永遠不要將SA帳號作為該虛擬目錄的登錄帳號
二
利用HTTP執行SQL語句
Microsoft SQL Server
可通過在URL中執行查詢直接訪問(假如注冊虛擬目錄時選擇了允許URL查詢)
客戶端可通過HTTP的GET和POST方法提交請求
示例
在下述例子中
xml是用於訪問test數據庫的虛擬目錄
在查詢示例中
如果查詢返回多個元素
根元素可通過以下方法之添加
在查詢前添加SELECT
$#@
;ROOT$#@
;
並在其後添加SELECT
$#@
;/ROOT$#@
;
傳遞一個root關鍵字作為查詢的參數
其值為ROOT(或其他任何值)
定義一個簡單查詢
下例返回數據庫test中所有用戶定義表的名字及建立日期
//IISserver/xml?sql=select+name
crdate+from+sysobjects+where+xtype=
u
+for+xml+auto&root=ROOT
定義一個涉及多個表的查詢
下例中查詢返回數據庫中所有用戶定義表的列的數據類型定義
//IISServer/xml?sql= select+s
name+as+表名
s
xtype+as+類別
+c
name+as+列名
+t
name+as+數據類型
+c
length+as+長度
+from+sysobjects+s
systypes+t
syscolumns+c+where+s
xtype=
u
+and+c
id=object_id(s
name)+and+c
xtype=
t
xtype+order+by+
+for+xml+auto&root=ROOT
在查詢中定義特殊字符
對於URL有特殊意義的字符
將其替換為
%數字
的形式
如SQL語句中的
LIKE
dt%
正確寫法應是的
LIKE
dt%
定義contenttype關鍵字
contenttype關鍵字規定返回的文檔的content
type
在URL中未規定xsl參數text/XML文檔默認的content
type
在URL中規定xsl參數
默認的contenttype 是text/html
定義xsl 關鍵字
下例返回數據庫test中所有用戶定義表的名字及建立日期
但這些信息經table
xsl處理後以表格形式顯示
//IISserver/xml?sql=select+name
crdate+from+sysobjects
+where+xtype=
u
+for+xml+auto&root=ROOT&xsl=table
xsl
在該例中
xsl文件存儲於該虛擬目錄中
其內容如下
$#@
;?xml version=
encoding=
GB
?$#@
;
$#@
;xsl:stylesheet xmlns:xsl=
xsl
$#@
;
$#@
;!
根模板
$#@
;
$#@
;xsl:template match=
/
$#@
;
$#@
;HTML$#@
;$#@
;BODY$#@
;
$#@
;xsl:apply
templates select=
ROOT
/$#@
;
$#@
;/BODY$#@
;$#@
;/HTML$#@
;
$#@
;/xsl:template$#@
;
$#@
;xsl:template match=
ROOT
$#@
;
$#@
;TABLE border=
$#@
;
$#@
;xsl:for
each select=
sysobjects[
]/@*
$#@
;
$#@
;TH$#@
;$#@
;xsl:eval$#@
;this
name$#@
;/xsl:eval$#@
;$#@
;/TH$#@
;
$#@
;/xsl:for
each$#@
;
$#@
;xsl:apply
templates select=
sysobjects
/$#@
;
$#@
;/TABLE$#@
;
$#@
;/xsl:template$#@
;
$#@
;xsl:template match=
sysobjects
$#@
;
$#@
;TR$#@
;
$#@
;xsl:for
each select=
@*
$#@
;
$#@
;TD$#@
;$#@
;xsl:value
of/$#@
;$#@
;/TD$#@
;
$#@
;/xsl:for
each$#@
;
$#@
;/TR$#@
;
$#@
;/xsl:template$#@
;
$#@
;/xsl:stylesheet$#@
;
三
利用HTTP執行模板文件
在URL中編寫長的SQL查詢非常麻煩
另一個方法是
用模板定義查詢(SQL或XPath)
模板文件名在URL中規定
使用模板你能
定義SQL查詢或XPath查詢
規定執行SQL或XPath查詢產生的XML片斷的頂級元素
定義能傳遞給SQL語句或XPath查詢的參數
聲明名字空間
定義應用結果文檔的XSL樣式表
另外
如果將所有需要的查詢都通過模板定義
並規定不允許在URL中直接執行SQL語句
將帶來更好的安全性
使用XML模板
模板文件的一般格式是
$#@
;ROOT xmlns:sql=
urn:schemas
microsoft
com:xml
sql
sql:xsl=
XSL FileName
$#@
;
$#@
;sql:header$#@
;
$#@
;sql:param$#@
;
$#@
;/sql:param$#@
;
$#@
;sql:param$#@
;
$#@
;/sql:param$#@
;
n
$#@
;/sql:header$#@
;
$#@
;sql:query$#@
;
sql statement(s)
$#@
;/sql:query$#@
;
$#@
;sql:xpath
query mapping
schema=
SchemaFileName
xml
$#@
;
XPath query
$#@
;/sql:xpath
query$#@
;
$#@
;/ROOT$#@
;
在模板中所有部分都是可選的
然而xmlns:sql=
urn:schemas
microsoft
com:xml
sql
是必須的
名字空間可命名為任何其他名字
sql只是一個別名
$#@
;ROOT$#@
;
該標記規定XML文檔的頂級元素
$#@
;ROOT$#@
;可取任意名字
$#@
;sql:header$#@
;
該標記用於包含頭信息
在當前的實現
只有$#@
;sql:param$#@
;能被置於該標記中
$#@
;sql:param$#@
;
該元素用於定義一個參數以傳遞給模板中的查詢
每個$#@
;param$#@
;元素定義一個參數
可以有多個$#@
;param$#@
;元素置於$#@
;sql:header$#@
;標記中
$#@
;sql:query$#@
;
該元素用於規定SQL查詢
可以定義多個$#@
;sql:query$#@
;元素
$#@
;sql:xpath
query$#@
;
規定XPath查詢
sql:xsl
規定作用於XML文檔的XSL樣式表
mapping
schema
該屬性用於標識XDR大綱
注意
每個$#@
;sql:query$#@
;或$#@
;sql:XPath
query$#@
;表示一個分離的事務
因此
如果在模板中有多個 $#@
;sql:query$#@
;或 $#@
;sql:XPath
query$#@
;標記
如果其中一個失敗
其他將繼續處理
使用模板執行SQL查詢
下例中
xm
From:http://tw.wingwit.com/Article/program/SQLServer/201311/22035.html