将XML Varchar数据转换为SQL Server中的图像类型

时间:2016-06-07 06:39:12

标签: sql-server xml sql-server-2012

我正在使用Reporting Service。

我需要更新所有报告,因此我要将所有报告ContentImage类型转换为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数据中做多次替换呢?你有没有人可以指导我。

1 个答案:

答案 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;