SQL Server xml應用(二)
上次xml應用只有講到查詢及轉出整個xml資料
其實還有第2篇要跟著寫上,但是當時手誤把資料
刪掉了,今天才找回。
接著要說明的是若已有xml的資料
要怎麼撈出這一筆xml中特定元素的資料
會使用到query、value、exist、update
及如何建置xml的索引以加快查詢速度。
(insert及delete暫不說明)
先建張table:
以上指令會建出一張叫產品型錄的表,只有一列,資料全在xml裡
資料庫裡的xml檔若沒經過轉換成table,應該就會是這樣
SQL Server也有對應的方法把單筆資料的xml檔按使用者需求撈出
以下用.query('')的方式撈出產品這一個元素中的內容
這樣撈出,還是一張xml表,這可能會造成前端程式人員的困擾
那更好操作就是給對方想要的,SELECT出像是表單的樣式
使用者更方便取值,這時可以用到.value('')的方式
除了query、value,還可以用exist功能查詢是否存在
避免回傳空值,因為找不到不能算是Error
update功能,若只有一筆資料有需要更新
總不能整表打掉重建
這時可以用update針對其中某元素進行修訂
最後是建置xml專用的索引,由於資料都是以xml的方式
放在一"格"中,一格就包含所有資料,容量上限是2G
假設今天有很多xml表單,都只佔一格
SQL Server找起來會花很多時間在掃描上
建置索引是必要的,降低系統在查找的資源耗用
其實還有第2篇要跟著寫上,但是當時手誤把資料
刪掉了,今天才找回。
接著要說明的是若已有xml的資料
要怎麼撈出這一筆xml中特定元素的資料
會使用到query、value、exist、update
及如何建置xml的索引以加快查詢速度。
(insert及delete暫不說明)
先建張table:
CREATE TABLE 產品型錄 ( 編號 INT PRIMARY KEY, 資料 XML ) GO INSERT INTO 產品型錄 VALUES(1, '<dataroot xmlns:od="urn:schemas-microsoft-com:officedata" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="產品清單.xsd" generated="2006-10-21T20:32:52"> <產品清單> <產品編號>1</產品編號> <產品>蘋果汁</產品> <單位數量>每箱24瓶</單位數量> <單價>18</單價> <庫存量>39</庫存量> <類別名稱>飲料</類別名稱> <供應商>桶一</供應商> </產品清單> <產品清單> <產品編號>2</產品編號> <產品>牛奶</產品> <單位數量>每箱24瓶</單位數量> <單價>19</單價> <庫存量>17</庫存量> <類別名稱>飲料</類別名稱> <供應商>桶一</供應商> </產品清單> <產品清單> <產品編號>24</產品編號> <產品>汽水</產品> <單位數量>每箱12瓶</單位數量> <單價>4.5</單價> <庫存量>20</庫存量> <類別名稱>飲料</類別名稱> <供應商>金美蘭</供應商> </產品清單> <產品清單> <產品編號>34</產品編號> <產品>啤酒</產品> <單位數量>每箱24瓶</單位數量> <單價>14</單價> <庫存量>111</庫存量> <類別名稱>飲料</類別名稱> <供應商>力錦</供應商> </產品清單> <產品清單> <產品編號>35</產品編號> <產品>芭樂汁</產品> <單位數量>每箱24瓶</單位數量> <單價>18</單價> <庫存量>20</庫存量> <類別名稱>飲料</類別名稱> <供應商>力錦</供應商> </產品清單> <產品清單> <產品編號>38</產品編號> <產品>綠茶</產品> <單位數量>每箱24瓶</單位數量> <單價>263.5</單價> <庫存量>17</庫存量> <類別名稱>飲料</類別名稱> <供應商>記成</供應商> </產品清單> <產品清單> <產品編號>39</產品編號> <產品>運動飲料</產品> <單位數量>每箱24瓶</單位數量> <單價>18</單價> <庫存量>69</庫存量> <類別名稱>飲料</類別名稱> <供應商>記成</供應商> </產品清單> <產品清單> <產品編號>43</產品編號> <產品>柳橙汁</產品> <單位數量>每箱24瓶</單位數量> <單價>46</單價> <庫存量>17</庫存量> <類別名稱>飲料</類別名稱> <供應商>一心</供應商> </產品清單> <產品清單> <產品編號>67</產品編號> <產品>礦泉水</產品> <單位數量>每箱24瓶</單位數量> <單價>14</單價> <庫存量>52</庫存量> <類別名稱>飲料</類別名稱> <供應商>力錦</供應商> </產品清單> <產品清單> <產品編號>70</產品編號> <產品>蘇打水</產品> <單位數量>每箱24瓶</單位數量> <單價>15</單價> <庫存量>15</庫存量> <類別名稱>飲料</類別名稱> <供應商>正一</供應商> </產品清單> <產品清單> <產品編號>75</產品編號> <產品>濃縮咖啡</產品> <單位數量>每箱24瓶</單位數量> <單價>7.75</單價> <庫存量>125</庫存量> <類別名稱>飲料</類別名稱> <供應商>義美美</供應商> </產品清單> <產品清單> <產品編號>76</產品編號> <產品>檸檬汁</產品> <單位數量>每箱24瓶</單位數量> <單價>18</單價> <庫存量>57</庫存量> <類別名稱>飲料</類別名稱> <供應商>利利</供應商> </產品清單> <產品清單> <產品編號>3</產品編號> <產品>蕃茄醬</產品> <單位數量>每箱12瓶</單位數量> <單價>10</單價> <庫存量>13</庫存量> <類別名稱>調味品</類別名稱> <供應商>桶一</供應商> </產品清單> <產品清單> <產品編號>4</產品編號> <產品>鹽巴</產品> <單位數量>每箱12瓶</單位數量> <單價>22</單價> <庫存量>53</庫存量> <類別名稱>調味品</類別名稱> <供應商>光權</供應商> </產品清單> <產品清單> <產品編號>5</產品編號> <產品>麻油</產品> <單位數量>每箱12瓶</單位數量> <單價>21.35</單價> <庫存量>0</庫存量> <類別名稱>調味品</類別名稱> <供應商>光權</供應商> </產品清單> <產品清單> <產品編號>6</產品編號> <產品>醬油</產品> <單位數量>每箱12瓶</單位數量> <單價>25</單價> <庫存量>120</庫存量> <類別名稱>調味品</類別名稱> <供應商>生活妙</供應商> </產品清單> <產品清單> <產品編號>8</產品編號> <產品>胡椒粉</產品> <單位數量>每箱30盒</單位數量> <單價>40</單價> <庫存量>6</庫存量> <類別名稱>調味品</類別名稱> <供應商>生活妙</供應商> </產品清單> <產品清單> <產品編號>15</產品編號> <產品>味素</產品> <單位數量>每箱30盒</單位數量> <單價>15.5</單價> <庫存量>39</庫存量> <類別名稱>調味品</類別名稱> <供應商>德菖</供應商> </產品清單> <產品清單> <產品編號>44</產品編號> <產品>蠔油</產品> <單位數量>每箱24瓶</單位數量> <單價>19.45</單價> <庫存量>27</庫存量> <類別名稱>調味品</類別名稱> <供應商>一心</供應商> </產品清單> <產品清單> <產品編號>61</產品編號> <產品>海鮮醬</產品> <單位數量>每箱24瓶</單位數量> <單價>28.5</單價> <庫存量>113</庫存量> <類別名稱>調味品</類別名稱> <供應商>百達</供應商> </產品清單> <產品清單> <產品編號>63</產品編號> <產品>甜辣醬</產品> <單位數量>每箱24瓶</單位數量> <單價>43.9</單價> <庫存量>24</庫存量> <類別名稱>調味品</類別名稱> <供應商>正一</供應商> </產品清單> <產品清單> <產品編號>65</產品編號> <產品>海苔醬</產品> <單位數量>每箱24瓶</單位數量> <單價>21.05</單價> <庫存量>76</庫存量> <類別名稱>調味品</類別名稱> <供應商>光權</供應商> </產品清單> <產品清單> <產品編號>66</產品編號> <產品>肉鬆</產品> <單位數量>每箱24瓶</單位數量> <單價>17</單價> <庫存量>4</庫存量> <類別名稱>調味品</類別名稱> <供應商>光權</供應商> </產品清單> <產品清單> <產品編號>77</產品編號> <產品>辣椒粉</產品> <單位數量>每袋3公斤</單位數量> <單價>13</單價> <庫存量>32</庫存量> <類別名稱>調味品</類別名稱> <供應商>義美美</供應商> </產品清單> <產品清單> <產品編號>16</產品編號> <產品>餅乾</產品> <單位數量>每箱30盒</單位數量> <單價>17.45</單價> <庫存量>29</庫存量> <類別名稱>點心</類別名稱> <供應商>正一</供應商> </產品清單> <產品清單> <產品編號>19</產品編號> <產品>糖果</產品> <單位數量>每箱30盒</單位數量> <單價>9.2</單價> <庫存量>25</庫存量> <類別名稱>點心</類別名稱> <供應商>康堡</供應商> </產品清單> <產品清單> <產品編號>20</產品編號> <產品>豆乾</產品> <單位數量>每箱30盒</單位數量> <單價>81</單價> <庫存量>40</庫存量> <類別名稱>點心</類別名稱> <供應商>康堡</供應商> </產品清單> <產品清單> <產品編號>21</產品編號> <產品>花生</產品> <單位數量>每箱30包</單位數量> <單價>10</單價> <庫存量>3</庫存量> <類別名稱>點心</類別名稱> <供應商>康堡</供應商> </產品清單> <產品清單> <產品編號>25</產品編號> <產品>巧克力</產品> <單位數量>每箱30盒</單位數量> <單價>14</單價> <庫存量>76</庫存量> <類別名稱>點心</類別名稱> <供應商>小噹</供應商> </產品清單> <產品清單> <產品編號>26</產品編號> <產品>綿綿糖</產品> <單位數量>每箱30盒</單位數量> <單價>31.23</單價> <庫存量>15</庫存量> <類別名稱>點心</類別名稱> <供應商>小噹</供應商> </產品清單> <產品清單> <產品編號>27</產品編號> <產品>牛肉乾</產品> <單位數量>每箱30包</單位數量> <單價>43.9</單價> <庫存量>49</庫存量> <類別名稱>點心</類別名稱> <供應商>小噹</供應商> </產品清單> <產品清單> <產品編號>47</產品編號> <產品>蛋糕</產品> <單位數量>每箱24個</單位數量> <單價>9.5</單價> <庫存量>36</庫存量> <類別名稱>點心</類別名稱> <供應商>順成</供應商> </產品清單> <產品清單> <產品編號>48</產品編號> <產品>玉米片</產品> <單位數量>每箱24包</單位數量> <單價>12.75</單價> <庫存量>15</庫存量> <類別名稱>點心</類別名稱> <供應商>順成</供應商> </產品清單> <產品清單> <產品編號>49</產品編號> <產品>薯條</產品> <單位數量>每箱24包</單位數量> <單價>20</單價> <庫存量>10</庫存量> <類別名稱>點心</類別名稱> <供應商>利利</供應商> </產品清單> <產品清單> <產品編號>50</產品編號> <產品>玉米餅</產品> <單位數量>每箱24包</單位數量> <單價>16.25</單價> <庫存量>65</庫存量> <類別名稱>點心</類別名稱> <供應商>利利</供應商> </產品清單> <產品清單> <產品編號>62</產品編號> <產品>山渣片</產品> <單位數量>每箱24包</單位數量> <單價>49.3</單價> <庫存量>17</庫存量> <類別名稱>點心</類別名稱> <供應商>百達</供應商> </產品清單> <產品清單> <產品編號>68</產品編號> <產品>綠豆糕</產品> <單位數量>每箱24包</單位數量> <單價>12.5</單價> <庫存量>6</庫存量> <類別名稱>點心</類別名稱> <供應商>康堡</供應商> </產品清單> <產品清單> <產品編號>11</產品編號> <產品>民眾起司</產品> <單位數量>每袋6包</單位數量> <單價>21</單價> <庫存量>22</庫存量> <類別名稱>日用品</類別名稱> <供應商>日正</供應商> </產品清單> <產品清單> <產品編號>12</產品編號> <產品>德國起司</產品> <單位數量>每箱12瓶</單位數量> <單價>38</單價> <庫存量>86</庫存量> <類別名稱>日用品</類別名稱> <供應商>日正</供應商> </產品清單> <產品清單> <產品編號>31</產品編號> <產品>溫馨起司</產品> <單位數量>每箱12瓶</單位數量> <單價>12.5</單價> <庫存量>0</庫存量> <類別名稱>日用品</類別名稱> <供應商>小陽堂</供應商> </產品清單> <產品清單> <產品編號>32</產品編號> <產品>白起司</產品> <單位數量>每箱12瓶</單位數量> <單價>32</單價> <庫存量>9</庫存量> <類別名稱>日用品</類別名稱> <供應商>小陽堂</供應商> </產品清單> <產品清單> <產品編號>33</產品編號> <產品>台中起司</產品> <單位數量>每箱12瓶</單位數量> <單價>2.5</單價> <庫存量>112</庫存量> <類別名稱>日用品</類別名稱> <供應商>德級</供應商> </產品清單> <產品清單> <產品編號>59</產品編號> <產品>蘇澳起司</產品> <單位數量>每箱24瓶</單位數量> <單價>55</單價> <庫存量>79</庫存量> <類別名稱>日用品</類別名稱> <供應商>玉成</供應商> </產品清單> <產品清單> <產品編號>60</產品編號> <產品>花起司</產品> <單位數量>每箱24瓶</單位數量> <單價>34</單價> <庫存量>19</庫存量> <類別名稱>日用品</類別名稱> <供應商>玉成</供應商> </產品清單> <產品清單> <產品編號>69</產品編號> <產品>黑起司</產品> <單位數量>每盒24個</單位數量> <單價>36</單價> <庫存量>26</庫存量> <類別名稱>日用品</類別名稱> <供應商>德級</供應商> </產品清單> <產品清單> <產品編號>71</產品編號> <產品>義大利起司</產品> <單位數量>每箱2個</單位數量> <單價>21.5</單價> <庫存量>26</庫存量> <類別名稱>日用品</類別名稱> <供應商>德級</供應商> </產品清單> <產品清單> <產品編號>72</產品編號> <產品>酸起司</產品> <單位數量>每箱2個</單位數量> <單價>34.8</單價> <庫存量>14</庫存量> <類別名稱>日用品</類別名稱> <供應商>小陽堂</供應商> </產品清單> <產品清單> <產品編號>22</產品編號> <產品>再來米</產品> <單位數量>每袋3公斤</單位數量> <單價>21</單價> <庫存量>104</庫存量> <類別名稱>穀類/麥片</類別名稱> <供應商>掬花</供應商> </產品清單> <產品清單> <產品編號>23</產品編號> <產品>燕麥</產品> <單位數量>每袋3公斤</單位數量> <單價>9</單價> <庫存量>61</庫存量> <類別名稱>穀類/麥片</類別名稱> <供應商>掬花</供應商> </產品清單> <產品清單> <產品編號>42</產品編號> <產品>糙米</產品> <單位數量>每袋3公斤</單位數量> <單價>14</單價> <庫存量>26</庫存量> <類別名稱>穀類/麥片</類別名稱> <供應商>一心</供應商> </產品清單> <產品清單> <產品編號>52</產品編號> <產品>三合一麥片</產品> <單位數量>每箱24包</單位數量> <單價>7</單價> <庫存量>38</庫存量> <類別名稱>穀類/麥片</類別名稱> <供應商>涵合</供應商> </產品清單> <產品清單> <產品編號>56</產品編號> <產品>白米</產品> <單位數量>每袋3公斤</單位數量> <單價>38</單價> <庫存量>21</庫存量> <類別名稱>穀類/麥片</類別名稱> <供應商>宏仁</供應商> </產品清單> <產品清單> <產品編號>57</產品編號> <產品>小米</產品> <單位數量>每袋3公斤</單位數量> <單價>19.5</單價> <庫存量>36</庫存量> <類別名稱>穀類/麥片</類別名稱> <供應商>宏仁</供應商> </產品清單> <產品清單> <產品編號>64</產品編號> <產品>黃豆</產品> <單位數量>每袋3公斤</單位數量> <單價>33.25</單價> <庫存量>22</庫存量> <類別名稱>穀類/麥片</類別名稱> <供應商>義美美</供應商> </產品清單> <產品清單> <產品編號>9</產品編號> <產品>讚油雞</產品> <單位數量>每袋500克</單位數量> <單價>97</單價> <庫存量>29</庫存量> <類別名稱>肉/家禽</類別名稱> <供應商>為全</供應商> </產品清單> <產品清單> <產品編號>17</產品編號> <產品>豬肉</產品> <單位數量>每袋500克</單位數量> <單價>39</單價> <庫存量>0</庫存量> <類別名稱>肉/家禽</類別名稱> <供應商>正一</供應商> </產品清單> <產品清單> <產品編號>29</產品編號> <產品>鴨肉</產品> <單位數量>每袋3公斤</單位數量> <單價>123.79</單價> <庫存量>0</庫存量> <類別名稱>肉/家禽</類別名稱> <供應商>義美美</供應商> </產品清單> <產品清單> <產品編號>53</產品編號> <產品>鹽水鴨</產品> <單位數量>每袋3公斤</單位數量> <單價>32.8</單價> <庫存量>0</庫存量> <類別名稱>肉/家禽</類別名稱> <供應商>涵合</供應商> </產品清單> <產品清單> <產品編號>54</產品編號> <產品>雞肉</產品> <單位數量>每袋3公斤</單位數量> <單價>7.45</單價> <庫存量>21</庫存量> <類別名稱>肉/家禽</類別名稱> <供應商>佳佳</供應商> </產品清單> <產品清單> <產品編號>55</產品編號> <產品>鴨肉</產品> <單位數量>每袋3公斤</單位數量> <單價>24</單價> <庫存量>115</庫存量> <類別名稱>肉/家禽</類別名稱> <供應商>佳佳</供應商> </產品清單> <產品清單> <產品編號>7</產品編號> <產品>海鮮粉</產品> <單位數量>每箱30盒</單位數量> <單價>30</單價> <庫存量>15</庫存量> <類別名稱>特製品</類別名稱> <供應商>生活妙</供應商> </產品清單> <產品清單> <產品編號>14</產品編號> <產品>沙茶</產品> <單位數量>每箱12瓶</單位數量> <單價>23.25</單價> <庫存量>35</庫存量> <類別名稱>特製品</類別名稱> <供應商>德菖</供應商> </產品清單> <產品清單> <產品編號>28</產品編號> <產品>烤肉醬</產品> <單位數量>每箱12瓶</單位數量> <單價>45.6</單價> <庫存量>26</庫存量> <類別名稱>特製品</類別名稱> <供應商>義美美</供應商> </產品清單> <產品清單> <產品編號>51</產品編號> <產品>豬肉乾</產品> <單位數量>每箱24包</單位數量> <單價>53</單價> <庫存量>20</庫存量> <類別名稱>特製品</類別名稱> <供應商>涵合</供應商> </產品清單> <產品清單> <產品編號>74</產品編號> <產品>雞湯塊</產品> <單位數量>每盒24個</單位數量> <單價>10</單價> <庫存量>4</庫存量> <類別名稱>特製品</類別名稱> <供應商>為全</供應商> </產品清單> <產品清單> <產品編號>10</產品編號> <產品>大甲蟹</產品> <單位數量>每袋500克</單位數量> <單價>31</單價> <庫存量>31</庫存量> <類別名稱>海鮮</類別名稱> <供應商>為全</供應商> </產品清單> <產品清單> <產品編號>13</產品編號> <產品>龍蝦</產品> <單位數量>每袋500克</單位數量> <單價>6</單價> <庫存量>24</庫存量> <類別名稱>海鮮</類別名稱> <供應商>德菖</供應商> </產品清單> <產品清單> <產品編號>18</產品編號> <產品>墨魚</產品> <單位數量>每袋500克</單位數量> <單價>62.5</單價> <庫存量>42</庫存量> <類別名稱>海鮮</類別名稱> <供應商>正一</供應商> </產品清單> <產品清單> <產品編號>30</產品編號> <產品>黃魚</產品> <單位數量>每袋3公斤</單位數量> <單價>25.89</單價> <庫存量>10</庫存量> <類別名稱>海鮮</類別名稱> <供應商>東黃海</供應商> </產品清單> <產品清單> <產品編號>36</產品編號> <產品>魷魚</產品> <單位數量>每袋3公斤</單位數量> <單價>19</單價> <庫存量>112</庫存量> <類別名稱>海鮮</類別名稱> <供應商>小坊</供應商> </產品清單> <產品清單> <產品編號>37</產品編號> <產品>干貝</產品> <單位數量>每袋3公斤</單位數量> <單價>26</單價> <庫存量>11</庫存量> <類別名稱>海鮮</類別名稱> <供應商>小坊</供應商> </產品清單> <產品清單> <產品編號>40</產品編號> <產品>蝦米</產品> <單位數量>每袋3公斤</單位數量> <單價>18.4</單價> <庫存量>123</庫存量> <類別名稱>海鮮</類別名稱> <供應商>普三</供應商> </產品清單> <產品清單> <產品編號>41</產品編號> <產品>蝦子</產品> <單位數量>每袋3公斤</單位數量> <單價>9.65</單價> <庫存量>85</庫存量> <類別名稱>海鮮</類別名稱> <供應商>普三</供應商> </產品清單> <產品清單> <產品編號>45</產品編號> <產品>雪魚</產品> <單位數量>每袋3公斤</單位數量> <單價>9.5</單價> <庫存量>5</庫存量> <類別名稱>海鮮</類別名稱> <供應商>日日通</供應商> </產品清單> <產品清單> <產品編號>46</產品編號> <產品>蚵</產品> <單位數量>每袋3公斤</單位數量> <單價>12</單價> <庫存量>95</庫存量> <類別名稱>海鮮</類別名稱> <供應商>日日通</供應商> </產品清單> <產品清單> <產品編號>58</產品編號> <產品>花枝</產品> <單位數量>每袋3公斤</單位數量> <單價>13.25</單價> <庫存量>62</庫存量> <類別名稱>海鮮</類別名稱> <供應商>大鈺</供應商> </產品清單> <產品清單> <產品編號>73</產品編號> <產品>海哲皮</產品> <單位數量>每袋3公斤</單位數量> <單價>15</單價> <庫存量>101</庫存量> <類別名稱>海鮮</類別名稱> <供應商>小坊</供應商> </產品清單> </dataroot>') SELECT * FROM 產品型錄 SELECT 資料 FROM 產品型錄 WHERE 編號=1
以上指令會建出一張叫產品型錄的表,只有一列,資料全在xml裡
資料庫裡的xml檔若沒經過轉換成table,應該就會是這樣
SQL Server也有對應的方法把單筆資料的xml檔按使用者需求撈出
以下用.query('')的方式撈出產品這一個元素中的內容
------------------------------------------------------------------------------------------------- SELECT 資料.query('dataroot/產品清單/產品') FROM 產品型錄 WHERE 編號=1 --若要增加根目錄(root)可以用以下的方式------------ SELECT 資料.query( '<產品清單> { for $i in dataroot/產品清單 return $i/產品 } </產品清單>' ) FROM 產品型錄 WHERE 編號=1
這樣撈出,還是一張xml表,這可能會造成前端程式人員的困擾
那更好操作就是給對方想要的,SELECT出像是表單的樣式
使用者更方便取值,這時可以用到.value('')的方式
----------------------------------------------------------------- --這樣會抓出第[5]個順序的<產品清單>元素-------------------------------- --value('(位置)[順位]' , '格式')----------------------------------- SELECT 資料.value('(dataroot/產品清單/產品)[5]','NCHAR(10)') AS 產品名 ,資料.value('(dataroot/產品清單/單價)[5]','MONEY') AS 售價 FROM 產品型錄 WHERE 編號=1 ----------------------------------------------------------------- --順位真的沒什麼用,沒人會去記它,那可以用=的方式找出要找的元素------------- --value('(位置[編號=?|產品=?])[順位]' , '格式')--------------------- SELECT 資料.value('(dataroot/產品清單[產品編號=20]/產品)[1]','NCHAR(10)') AS 產品名 ,資料.value('(dataroot/產品清單[產品編號=20]/單價)[1]','MONEY') AS 售價 FROM 產品型錄 WHERE 編號=1 SELECT 資料.value('(dataroot/產品清單[產品="啤酒"]/產品)[1]','NCHAR(10)') AS 產品名 ,資料.value('(dataroot/產品清單[產品="啤酒"]/單價)[1]','MONEY') AS 售價 FROM 產品型錄 WHERE 編號=1 --變化一下,可以用ID變數來查----------------------------------------- DECLARE @id INT SET @id=34 SELECT 資料.value('(dataroot/產品清單[產品編號=sql:variable("@id")]/產品)[1]','NCHAR(10)') AS 產品名 ,資料.value('(dataroot/產品清單[產品編號=sql:variable("@id")]/單價)[1]','MONEY') AS 售價 FROM 產品型錄 WHERE 編號=1 --即然可以用變數,那當然就可以用PROCEDURE------------------------------ CREATE PROC XML產品查詢 @id INT AS SELECT 資料.value('(dataroot/產品清單[產品編號=sql:variable("@id")]/產品)[1]','NCHAR(10)') AS 產品名 ,資料.value('(dataroot/產品清單[產品編號=sql:variable("@id")]/單價)[1]','MONEY') AS 售價 FROM 產品型錄 WHERE 編號=1 GO EXEC XML產品查詢 1 --程式端只需要執行這樣就可以取出值了
除了query、value,還可以用exist功能查詢是否存在
避免回傳空值,因為找不到不能算是Error
SELECT 資料.exist('dataroot/產品清單[產品編號=1]/產品') FROM 產品型錄 WHERE 編號=1 IF (SELECT 資料.exist('dataroot/產品清單[產品編號=500]/產品')FROM 產品型錄 WHERE 編號=1)=1 SELECT 資料.value('(dataroot/產品清單[產品編號=500]/產品)[1]','NCHAR(10)') AS 產品名 ,資料.value('(dataroot/產品清單[產品編號=500]/單價)[1]','MONEY') AS 售價 FROM 產品型錄 WHERE 編號=1 ELSE SELECT '查無此資料'
update功能,若只有一筆資料有需要更新
總不能整表打掉重建
這時可以用update針對其中某元素進行修訂
----------------------------------------------------------------- UPDATE 產品型錄 SET 資料.modify('replace value of (dataroot/產品清單[產品編號=58]/單價/text())[1] with 33') WHERE 編號=1 UPDATE 產品型錄 SET 資料.modify('replace value of (dataroot/產品清單[產品編號=73]/產品/text())[1] with "超Q海蜇皮"') WHERE 編號=1 UPDATE 產品型錄 SET 資料.modify('replace value of (dataroot/產品清單[產品編號=73]/單價/text())[1] with 45') WHERE 編號=1
最後是建置xml專用的索引,由於資料都是以xml的方式
放在一"格"中,一格就包含所有資料,容量上限是2G
假設今天有很多xml表單,都只佔一格
SQL Server找起來會花很多時間在掃描上
建置索引是必要的,降低系統在查找的資源耗用
----------------------------------------------------------------- CREATE PRIMARY XML INDEX 主XML索引 ON 產品型錄(資料) CREATE XML INDEX 次要XML路徑索引 ON 產品型錄(資料) USING XML INDEX 主XML索引 FOR PATH --以路徑(path)為索引的依據 -----------------------------------------------------------------
留言
張貼留言