SQL Server xml應用(二)

上次xml應用只有講到查詢及轉出整個xml資料
其實還有第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)為索引的依據


-----------------------------------------------------------------

留言

熱門文章