如何使用SQL查询更新保存在varchar字段中的XML属性的值?

时间:2013-11-07 00:43:28

标签: sql xml sql-server-2008

我们有一个名为tReportTemplate的表,看起来像

Table tReportTemplate (
 [ReportTemplateID] int NOT NULL,
 [CustomProperties] [varchar](7500) NOT NULL,
 CONSTRAINT [PK_tReportTemplate] PRIMARY KEY
 (
   [ReportTemplateID] ASC
 )
)

在[CustomProperties]中,我们保存报告模板,该模板是XML,如下所示 -

<?xml version="1.0" encoding="utf-16"?>
<xs:schema targetNamespace="urn:wtxreport-1.0" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns="urn:wtxreport-1.0" elementFormDefault="qualified" attributeFormDefault="unqualified">
  <reportTemplate1>
    <template reportName="Demo" description="" beginDate="01/01/1901" endDate="01/01/2001" />
    <element1 att1="" att2="0" att3="0,3,5,1" />
    <element2 att4="1,4,2,6,7,5" att5="7,2,5,6,1,4,0" att6="0,1,2,3,4,6,8,9,10,11"/>
    <element3   att7="2,12,1,6,7" att8="0" att9="True" />
    <element4 att10="0" att11="False" att12="False" />
    <element5 att13="6"  att14="false" att15="0"/>
    <element6 att16="0" att17="False" />
    <element7 att18="0" />
  </reportTemplate1>
</xs:schema>

我们在该表中有超过10,000条记录。现在我需要在element2中更新att4的值,其中att4值是6乘2.我已经搜索并尝试但没有找到任何合适的解决方案。希望有人能指出我正确的方向。提前谢谢。

1 个答案:

答案 0 :(得分:1)

执行此操作可能有点棘手,因为您的列类型是VARCHAR而不是XML,但您可以编写一些我认为可以解决的转换脚本。

为了使其正常工作,您需要剥离&lt; ?xml ...&gt;,&lt; xs:schema ...&gt;&lt; / XS:模式&GT;标记出来并在最后一次表更新时将它们添加回来。

检查出来:

DECLARE @tempTable
(reportTemplateID INT, CustomProperties VARCHAR(7500), CustomPropertiesXML XML)

INSERT INTO @tempTable(reportTemplateID, customProperties)
SELECT ReportTemplateID, CustomProperties
FROM tReportTemplate

-- UPDATE to strip out <?xml ... >, <xs:schema ... ></xs:schema> tags and 
-- place the XML in @tempTable.CustomPropertiesXML

UPDATE t
SET customPropertiesXML.modify('replace value of (reportTemplate1/element2/@att4[1])[1] with [WhateverYouNeedToUpdateItTo]')
FROM @tempTable t

-- UPDATE to add in <?xml ... >, <xs:schema ... ></xs:schema> tags and 
-- place the now VARCHAR back in @tempTable.CustomProperties

UPDATE trt
SET trt.CustomProperties = t.CustomProperties)
FROM tReportTemplate trt
JOIN @tempTable t
  ON t.reportTemplateID = trt.ReportTemplateID