2017-04-18 58 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)”值 - 完全按照预期 –