-- 作者:netsnopy
-- 發(fā)布時間:2009/12/13 10:38:54
-- xml轉(zhuǎn)換為關(guān)系數(shù)據(jù)
在學(xué)習(xí)自定義表單的過程中,增加表格域后,我們?nèi)绾伟驯砀裰械臄?shù)據(jù)取出來的? c_data是xml類型的字段,所以表單域的所有值都在xml序列中, 無論query還是value返回的只是一個值,不能返回多值。那么如何像查詢關(guān)系型數(shù)據(jù)一樣, 返回xml序列中多個同名元素節(jié)點的內(nèi)容呢。如: <rows> <row> <e_vend>多個供應(yīng)商</e_vend> <c_user /> <eform_s_user>0000</eform_s_user> <e_dt> <drows> <drow> <v_tel>asdf</v_tel> <v_add>asdf</v_add> <v_name>asdfasd</v_name> </drow> <drow> <v_tel>電話2</v_tel> <v_add>第二個供應(yīng)商的地址</v_add> <v_name>第二個供應(yīng)商</v_name> </drow> <drow> <v_tel>電話3</v_tel> <v_add>第三個供應(yīng)商的地址</v_add> <v_name>第三個供應(yīng)商</v_name> </drow> </drows> </e_dt> </row> </rows> 如何像取關(guān)系型數(shù)據(jù)一樣,返回供應(yīng)商名稱、電話、地址三個字段的值。 在這里使用nodes()表值函數(shù) 和Apply 運算符來實現(xiàn)。APPLY 有兩種形式:CROSS APPLY 和 OUTER APPLY。CROSS APPLY 僅返回外部表中通過表值函數(shù)生成結(jié)果集的行。 OUTER APPLY 既返回生成結(jié)果集的行,也返回不生成結(jié)果集的行,其中表值函數(shù)生成的列中的值為 NULL。 對于nodes()和apply還么有看的很明白,但是給我們提供了解決問題的方法,方法如下: select T2.aa.query(\'.\').value(\'(/drow/v_name)[1]\',\'nvarchar(100)\') as 供應(yīng)商名稱, T2.aa.query(\'.\').value(\'(/drow/v_tel)[1]\',\'nvarchar(100)\') as 供應(yīng)商電話, T2.aa.query(\'.\').value(\'(/drow/v_add)[1]\',\'nvarchar(100)\') as 供應(yīng)商地址 from tbc_eform_data cross APPLY c_data.nodes(\'for $i in /rows/row/e_dt/drows/drow where $i/v_name!="" return $i\' ) as T2(aa) where c_guid=\'B71DC77C-6617-4743-B6AB-5E534970FB80\'
這樣對于自定義表單,可在審批后,通過執(zhí)行sql腳本吧自定義表單的內(nèi)容放置的數(shù)據(jù)庫中,如采購員發(fā)起的供應(yīng)商審批,可以在審批后把多個供應(yīng)商信息或者合同信息按規(guī)則保存到系統(tǒng)中,省掉再錄入一次供應(yīng)商或者合同的過程,實現(xiàn)流程審批與業(yè)務(wù)系統(tǒng)自動化結(jié)合。
[此貼子已經(jīng)被作者于2009-12-16 11:08:10編輯過]
|