2017-04-18 41 views
1

我正在使用SQL Server 2008,並且對SQL來說是比較新的。使用解析的xml數據創建一個新列

我有一張表,其中包含一個數據類型爲xml的列。在此列中的XML包含客戶收據餐館信息:

<order> 
    <Check> 
     <CheckHeader> 
      <CheckNumber>279084</CheckNumber> 
      <ServerNumber>186</ServerNumber> 
      <ServerName>ServerName</ServerName> 
      <CheckTotal>8.95</CheckTotal> 
     </CheckHeader> 
    </Check> 

在這裏我學會了如何解析出我所關心的信息,即<CheckTotal>之後做一些研究:

SELECT 
    order_xml.value('(/order//CheckTotal/node())[1]', 'nvarchar(max)') as CheckTotal 
FROM 
    CheckTable 

我在哪裏我沒有掙扎是如何將這個解析的CheckTotal值添加到此CheckTable表中的新列(當然確保CheckTotal與適當的行相匹配)。

CheckTable表看起來像這樣:

CheckTable Image

我有什麼已經做了?

那麼我改變了我的表添加一個新的列,我試圖創建一個@temptTb我在那裏添加了解析CheckTable值和解析CheckNumber值。我解析了CheckNumber的值,以確保當我加入這兩個表以嘗試更新新列時,我會匹配基於CheckNumber的正確CheckTotal ......當然事實證明,對於我數據集CheckNumber被回收並重新使用。

所以現在,我確信希望這樣的解決方案存在,我可以立即將我解析的xml CheckTotal值直接添加到我的CheckTable表中的新列中。

回答

0

如果你的XML永遠只包含一個以便與一個<Check>裏面 - 你可以嘗試這樣的事:

UPDATE dbo.CheckTable 
SET CheckTotal = CheckXml.value('(/order[1]/Check[1]/CheckHeader[1]/CheckTotal[1])', 'decimal(18,2)') 

它變得有點棘手,如果你的XML包含的任何級別的多個元素元素層次結構....

+0

這真的很好!出於好奇 - 在CheckXml.Value函數中,'decimal(18,2)'是做什麼的? –

+0

@BrianP:它將那個'' XML元素中包含的值轉換爲那個特定的數據類型 - 所以對'.value()'的返回值實際上是一個「十進制(18,2)」值 - 完全按照預期 –