如何在SQL中替换XML节点值?

时间:2015-04-24 13:02:11

标签: sql sql-server xml replace xml-parsing

我在sql字段中有一个xml值

<Menu>
  <MenuItem>
    <MENU_ID>D</MENU_ID>
    <MENU_Read>1</MENU_Read>
    <MENU_Write>1,2,3,4,5</MENU_Write>
  </MenuItem>
  <MenuItem>
    <MENU_ID>A</MENU_ID>
    <MENU_Read>1</MENU_Read>
    <MENU_Write>6,7</MENU_Write>
  </MenuItem>
  <MenuItem>
    <MENU_ID>B</MENU_ID>
    <MENU_Read>1</MENU_Read>
    <MENU_Write>8,9,10</MENU_Write>
  </MenuItem>
  <MenuItem>
    <MENU_ID>C</MENU_ID>
    <MENU_Read>1</MENU_Read>
    <MENU_Write>11,12,133</MENU_Write>
  </MenuItem>
</Menu>

我想将MENU_Write节点兄弟的当前值替换为MENU_ID节点值“C”,并带有空值。我该怎么做?

2 个答案:

答案 0 :(得分:1)

您可以尝试使用SQL Server的replace value of,例如:

declare @T XML = '<Menu>
  <MenuItem>
    <MENU_ID>D</MENU_ID>
    <MENU_Read>1</MENU_Read>
    <MENU_Write>1,2,3,4,5</MENU_Write>
  </MenuItem>
  <MenuItem>
    <MENU_ID>A</MENU_ID>
    <MENU_Read>1</MENU_Read>
    <MENU_Write>6,7</MENU_Write>
  </MenuItem>
  <MenuItem>
    <MENU_ID>B</MENU_ID>
    <MENU_Read>1</MENU_Read>
    <MENU_Write>8,9,10</MENU_Write>
  </MenuItem>
  <MenuItem>
    <MENU_ID>C</MENU_ID>
    <MENU_Read>1</MENU_Read>
    <MENU_Write>11,12,133</MENU_Write>
  </MenuItem>
</Menu>'

set @T.modify('replace value of (//MenuItem[MENU_ID="C"]/MENU_Write/text())[1] with ""')

<强> SQL Fiddle

答案 1 :(得分:0)

可以只使用一个简单的UPDATE,并附上你想要的全文:

UPDATE table
SET xamlfield = 
'<Menu>
  <MenuItem>
    <MENU_ID>D</MENU_ID>
    <MENU_Read>1</MENU_Read>
    <MENU_Write>1,2,3,4,5</MENU_Write>
  </MenuItem>
  <MenuItem>
    <MENU_ID>A</MENU_ID>
    <MENU_Read>1</MENU_Read>
    <MENU_Write>6,7</MENU_Write>
  </MenuItem>
  <MenuItem>
    <MENU_ID>B</MENU_ID>
    <MENU_Read>1</MENU_Read>
    <MENU_Write>8,9,10</MENU_Write>
  </MenuItem>
  <MenuItem>
    <MENU_ID> </MENU_ID>
    <MENU_Read>1</MENU_Read>
    <MENU_Write>11,12,133</MENU_Write>
  </MenuItem>
</Menu>'
WHERE id = 123