繁体   English   中英

存储在ntext列中的SQL Update XML值

[英]SQL Update XML Value stored in ntext colum

我需要更新存储在ntext列中的XML数据内的两个值。 我有一个要测试的数据库副本,但对于所找到的信息我还没有成功。

这是我需要更新的XML示例:

<?xml version="1.0" encoding="utf-16"?>
<cmnReportExportParameters xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<DSNs>
    <ReportDSN>
       <Name>Name</Name>
       <Database>DBName</Database>
       <Server />
       <User>user</User>
       <Password>removed </Password>
      <DevelopmentName>DBName</DevelopmentName>
    </ReportDSN>
  </DSNs>
</cmnReportExportParameters>

我需要更新此XML数据中的“用户”和“密码”字段。 这是旧版CMS应用程序的一部分,我只是在支持该系统(我不是开发人员)。

我可以成功地转换数据select Name, Parameters, CAST(parameters as xml) from tablename

任何指导表示赞赏。

这远非理想,但这是我可以想到的唯一方法。 当你的列是错误的数据类型( ntext ),你不能使用modify XQUERY命令。 因此,您必须将数据插入临时表中,对其进行更新,然后将其重新插入。 这不会对性能产生很大的影响,但是可以。 正如我之前所说,修复数据类型将使此操作变得更加容易:

CREATE TABLE [sample] (YourIDCol int IDENTITY(1,1),
                       NotXML ntext);
INSERT INTO [sample] (NotXML)
VALUES (
N'<?xml version="1.0" encoding="utf-16"?>
<cmnReportExportParameters xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<DSNs>
    <ReportDSN>
       <Name>Name</Name>
       <Database>DBName</Database>
       <Server />
       <User>user</User>
       <Password>removed </Password>
      <DevelopmentName>DBName</DevelopmentName>
    </ReportDSN>
  </DSNs>
</cmnReportExportParameters>');
GO
CREATE TABLE #UpdateXML (ID int, ActualXML xml);
INSERT INTO #UpdateXML (ID,ActualXML)

SELECT YourIDCol,
       TRY_CONVERT(xml,NotXML)
FROM [sample]
WHERE TRY_CONVERT(xml,NotXML) IS NOT NULL
  AND YourIDCol = 1; --if you need it

UPDATE #UpdateXML
SET ActualXML.modify('replace value of (cmnReportExportParameters/DSNs/ReportDSN/User/text())[1] with ("NewUsername")');

UPDATE #UpdateXML
SET ActualXML.modify('replace value of (cmnReportExportParameters/DSNs/ReportDSN/Password/text())[1] with ("NewPassword")');

UPDATE S
SET NotXML = CONVERT(ntext,CONVERT(nvarchar(MAX),U.ActualXML)) --yuck
FROM [sample] S
     JOIN #UpdateXML U ON S.YourIDCol = U.ID;

SELECT *
FROM [sample];

DROP TABLE #UpdateXML;
GO

DROP TABLE [sample];

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM