我正在使用Reporting Service。
我需要更新所有报告,因此我要将所有报告Content
从Image
类型转换为XML
类型。
完美无缺。
我在下面尝试过,但它没有正确转换。
SELECT CONVERT(VARCHAR(MAX), CONVERT(VARBINARY(MAX), REPLACE(XMLDATA,'<FontFamily>1</FontFamily>','<FontFamily>2</FontFamily>'))) FROM #a
此处包含我更新的XML
数据。
REPLACE(XMLDATA,'<FontFamily>1</FontFamily>','<FontFamily>2</FontFamily>'))
简而言之,我想在相同的XML数据中做很多替换
例如,我有类似下面的数据,
<Textbox Name="ID">
<CanGrow>true</CanGrow>
<KeepTogether>true</KeepTogether>
<Paragraphs>
<Paragraph>
<TextRuns>
<TextRun>
<Value></Value>
<Style>
<FontFamily>Calibri</FontFamily>
<FontSize>8pt</FontSize>
</Style>
</TextRun>
</TextRuns>
<Style>
<TextAlign>Right</TextAlign>
</Style>
</Paragraph>
</Paragraphs>
<rd:DefaultName></rd:DefaultName>
</Textbox>
这里我需要替换字体系列以及字体大小等等。
那么如何在XML数据中做多次替换呢?你有没有人可以指导我。
答案 0 :(得分:1)
数据类型IMAGE
已弃用...
按原样,您不会转换为XML
,而是转换为(N)VARCHAR
。一个可以使用像replace这样的字符串方法修改字符串级别的XML数据,但是 - 在大多数情况下 - 使用 XML DML使用真正的XML 会更好方法......
这个小例子应该显示你可能需要的所有演员:
--this is a mock of your table with the IMAGE column with two rows
DECLARE @tbl TABLE(ID INT,XmlData IMAGE);
INSERT INTO @tbl VALUES
(1,'<root><SomeData rowID="1"><FontFamily>1</FontFamily></SomeData></root>')
,(2,'<root><SomeData rowID="2"><FontFamily>2</FontFamily></SomeData></root>');
--The XmlData is casted to VARCHAR(MAX) as well as to XML
--The result is filled into a new table #tmpTable
SELECT ID
,XmlData AS ImageType
,CAST(XmlData AS VARBINARY(MAX)) AS VarbinaryType
,CAST(CAST(XmlData AS VARBINARY(MAX)) AS VARCHAR(MAX)) AS VarcharMaxType
,CAST(CAST(XmlData AS VARBINARY(MAX)) AS XML) AS XmlType
INTO #tmpTable
FROM @tbl;
--this is the actual content
SELECT * FROM #tmpTable;
--modify with string method
UPDATE #tmpTable SET VarcharMaxType=REPLACE(VarcharMaxType,'<FontFamily>1</FontFamily>','<FontFamily>99</FontFamily>');
--modify with XML-DML method
UPDATE #tmpTable SET XmlType.modify('replace value of (/root/SomeData[@rowID=1]/FontFamily/text())[1] with 99');
--the updated content
SELECT * FROM #tmpTable;
--and all converted back to IMAGE
SELECT ID
,ImageType
,CAST(VarcharMaxType AS IMAGE) AS VarcharMaxAsIMAGE
,CAST(CAST(XmlType AS VARCHAR(MAX)) AS IMAGE) AS XmlTypeAsIMAGE
FROM #tmpTable;
GO
--Clean up
DROP TABLE #tmpTable;