摘要: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>
不過我覺得這方法可能會有效能上的隱憂,
如果前輩們有什麼建議或想法也歡迎您提出來。