如何在SQL Server中从XML数据中提取值时修改值

时间:2011-04-20 16:14:05

标签: sql xml sql-server-2008 xquery-sql

以下是关于SQL中的XQuerying的问题(SQL Server 2008)

最初,我需要输出一些不同的XML,以供参考:

declare @XMLNODE table (id int identity, doc xml)
insert @XMLNODE (doc) values (   
'
 <Root>
    <Elements>
      <Items>
        <OldItem>

          <ID>1</ID>
          <Show Pointer="yes" />
          <Display Pointer="Display">
            <Detail1>some Details</Detail1>
          </DisplayDetails>

        </OldItem>
      </Items>
    </Elements>
    </Root>'
)

    SELECT  a.value('(ID)[1]','int') as ID,
    a.value('(Show/@Pointer)[1]', 'varchar(5)') AS ShowItem,
    a.value('Display[1]/@Pointer[1]="Display"', 'varchar(10)') as DisplayDetails, -- Set to 'true' or 'false'
    a.value('DisplayDetails[1][@Pointer[1]="Display"]/Detail1[1]', 'varchar(max)') as Detail1
    FROM    @XMLNODE t
    cross apply
    t.doc.nodes('//OldItem') x(a)
    FOR XML PATH ('Items'),
    ROOT('Elements')

所以,现在我有一个像这样的XML:

<Elements>
  <Items>
    <ID>1</ID>
    <ShowItem>yes</ShowItem>
    <DisplayDetails>true</DisplayDetails>
    <Detail1>some Details</Detail1>
  </Items>
</Elements>

想要添加一些修改为1或没有值,基于它是否为真/是等。

即。期望的:

<Elements>
  <Items>
    <ID>1</ID>
    <ShowItem>1</ShowItem>
    <DisplayDetails>1</DisplayDetails>
    <Detail1>some Details</Detail1>
  </Items>
</Elements>

此外,如果<DisplayDetails>false</DisplayDetails>我只想将其更新为<DisplayDetails />

有没有办法直接比较查询中的输入(例如,是或否)并将其设置为1或0而不是true或false?我正在使用.query来使用这些值并根据需要添加其他信息。

1 个答案:

答案 0 :(得分:0)

我不是非常从SQL查询XML,但是如果我为非XML的任何事情做这件事,我会在SELECT语句中执行类似的操作:

SELECT  a.value('(ID)[1]','int') as ID,
case 
  when a.value('(Show/@Pointer)[1]', 'varchar(5)') = 'yes' then '1'
  else '0'
End case as 'ShowItem',
a.value('Display[1]/@Pointer[1]="Display"', 'varchar(10)') as DisplayDetails, -- Set to 'true' or 'false'
a.value('DisplayDetails[1][@Pointer[1]="Display"]/Detail1[1]', 'varchar(max)') as Detail1
FROM    @XMLNODE t
cross apply
t.doc.nodes('//OldItem') x(a)

注意:这还没有尝试过,我不在数据库客户端上来确保我的语法完全正确。但是,检查数据库中的值并根据该值显示其他内容是相对简单的。