SQL讀取XML欄位,sqlxml欄位

來源:互聯網
上載者:User

SQL讀取XML欄位,sqlxml欄位


最近要對一套老系統進行資料移轉,這樣苦逼的工作就來了,需要新舊兩套系統資料表欄位進行對比,最終將老系統的資料移轉到新系統中來。

儘管資料結構不一致、部分欄位不一致,也只是噁心一點麻煩一點,勉勉強強速度慢點,還是可以整理出來,並編寫好遷移的SQL語句。


一步一步走了好幾步了,出來個更噁心的怪物了!強大的XML資料欄位


本來應該是單獨存到一個子表的資訊,在老系統中硬生生的存到了一個XML欄位中

<root>    <people id=1 name=tom/>    <people id=2 name=jim/></root>
在資料移轉的時候,必須要把這些資料,轉移到一個子表中,那麼我需要可以對XML進行讀取,如下:

IDNAME1TOM1JIM


開動大腦想想,怎麼破呢?

分兩步走吧,第一步,首選實現針對單獨一條資料的XML資訊實現讀取,然後再實現多條資料的XML讀取,當然能讀出來,也就可以再插入了,O(∩_∩)O哈哈~


1.實現單獨一條資料XML的讀取

DECLARE @XML XMLSELECT @XML='<root>    <people id="1" name="tom"/>    <people id="2" name="jim"/></root>'SELECT v.value('@id[1]','VARCHAR(20)') AS ID, v.value('@name[1]','VARCHAR(20)') AS NameFROM @XML.nodes('/root/people') x(v)

2.實現多條資料XML的讀取

由於每一條XML資料都可能有多條資料,在這裡,我使用了遊標,每次遍曆一條資料,讀取XML,然後針對該條資料的自資料進行資料插入更新

DECLARE @ID VARCHAR(36)DECLARE @XML XMLDECLARE CUR CURSOR FORSELECT id FROM testTableFOR READ ONLYOPEN CUR;FETCH NEXT FROM CUR INTO @ID    WHILE @@FETCH_STATUS=0BEGIN SELECT @XML=xmlField FROM testTable WHERE id=@IDSELECT v.value('@id[1]','VARCHAR(20)') AS ID,v.value('@name[1]','VARCHAR(20)') AS NameFROM @XML.nodes('/root/people') x(v)--根據該SQL修改為插入或者更新語句的SQL,可以將其括起來,作為一個虛表FETCH NEXT FROM CUR INTO @IDENDCLOSE CURDEALLOCATE CUR

OK,問題到此搞定!


大家有什麼好的辦法,可以溝通交流。(第二步驟,我是一次性執行資料移轉使用,如果是常規經常性使用,那麼是很不建議使用遊標的!就需要一個更好的解決方案。。。



原文參考:http://www.cnblogs.com/l1pe1/archive/2010/07/28/1787254.html

裡邊好多各種讀取、操作XML的方式,我這裡只使用了很小的一部分,大家想學習更新,看原文收穫也會很大的!

相關文章

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.