我们有一个名为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.我已经搜索并尝试但没有找到任何合适的解决方案。希望有人能指出我正确的方向。提前谢谢。
答案 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