SQL XQuery 體驗

  • 845
  • 0

摘要:SQL XQuery 體驗

 

今天有個小需求,
資料庫中有張資料表,裡面的一個欄位是存 XML 格式,
資料大概是長下面這樣

<Task>
  <Info>
    <Version>1.0</Version>
    <Type>Type</Type>
  </Info>
  <TaskInfo DurationDay="2" EventDate="2013/7/5 下午 03:55:07" Cause="測試建立">流程</TaskInfo>
  <Contents>
    <Forms FormID="3" RoleID="9" FrontForm="" CreateUser="27" Status="0">量表</Forms>
    <Forms FormID="6" RoleID="12" FrontForm="" CreateUser="23" Status="0">評估</Forms>
    <Forms FormID="13" RoleID="2" FrontForm="" CreateUser="21" Status="0">變更資料表</Forms>
  </Contents>
</Task>

 

使用者希望能夠篩選節點 Form 當中屬性 CreateUser 的資料,
換個方式說,就是我想找 CreateUser="23" 的資料,上面那個例子的資料就會被找出來,
由於使用 Entity Framework 這欄位在程式中是被對應成 string,
可是卻無法直接下 Contains 來查詢,因為 XML 欄位無法使用 LIKE 查詢,
於是想到乾脆直接建一個 VIEW 其中利用 XQuery 把值找出來以後放在一個新欄位被查詢,
方式如下:

declare @x xml
set @x=
'
  
    1.0
    Type
  
  流程
  
    量表
    評估
    變更資料表
  
'

SELECT CONVERT(VARCHAR(MAX), @x.query('for $step in /Task/Contents/Forms[@CreateUser] return {data($step/@CreateUser)} '))

 

結果如下

<u>27</u><u>23</u><u>21</u>

 

不過我覺得這方法可能會有效能上的隱憂,
如果前輩們有什麼建議或想法也歡迎您提出來。