TSQL替换大块文本



我有一个数据库,在nvarchar(max)中存储xml数据。这是存储的一部分数据。

<Groups />
<Groups2 />
<pairs>
<p>
<Name>AllowPeerDownload</Name>
<Val>false</Val>
</p>
<p>
<Name>AllowUserCancelScan</Name>
<Val>false</Val>
</p>
<p>
<Name>AutoCloseTimeout</Name>
<Val>60</Val>
</p>
<p>
<Name>CalculateHashes</Name>
<Val>false</Val>
</p>
<p>
<Name>DayOfMonthEnabled_0</Name>
<Val>false</Val>
</p>
</pairs>
<Default>false</Default>

它适用于以rep%开头的名称,但它使其余部分为空。


UPDATE AgentBehavior 
SET BehaviorXML = ( SELECT 
LEFT(BehaviorXML, CHARINDEX('<pairs>', BehaviorXML) +7) 
+     '<p>
<Name>AllowPeerDownload</Name>
<Val>True</Val>
</p>
<p>
<Name>AllowUserCancelScan</Name>
<Val>false</Val>
</p>
<p>
<Name>AutoCloseTimeout</Name>
<Val>60</Val>
</p>
<p>
<Name>CalculateHashes</Name>
<Val>false</Val>
</p>
<p>
<Name>DayOfMonthEnabled_0</Name>
<Val>True</Val>
</p>'

+ SUBSTRING(BehaviorXML, CHARINDEX('</pairs', BehaviorXML), LEN(BehaviorXML))
FROM    AgentBehavior AB
where AgentBehavior.name = ab.name
and name like 'Rep%' )

这更新了我想要的,但它更新了那些不以rep%开头的为空。任何帮助都将非常感激。xAFGuy

所以我无法让命令在TSQL中工作。如果不更新所有列或得到子查询返回多个值的错误,我就无法使选择工作。我对PowerShell的了解比TSQL多一点,所以我决定用它来代替。

此脚本将查找两个XML标记之间的任何文本,对于本例,并将其替换为两个+符号之间的文本。

cls 
$TableName = "TestTable"
$DBServer = "TesServer"
$DBName = "TestDB"

$AgentNames = Invoke-Sqlcmd -Query "SELECT top 2 [Name] FROM $DbName.dbo.$TableName where name like 'rep%' " -ServerInstance $DBServer
Foreach ($AgentName in $AgentNames) {
$Name = $AgentName.Name
$SQLCommand = " use $DBName
UPDATE AgentBehaviorTestArea
SET BehaviorXML = ( SELECT   LEFT(BehaviorXML, CHARINDEX('<pairs>', BehaviorXML) +7) 
+     '<p>
<Name>AllowPeerDownload</Name>
<Val>False</Val>
</p>
<p>
<Name>AllowUserCancelScan</Name>
<Val>false</Val>
</p>'

+ SUBSTRING(BehaviorXML, CHARINDEX('</pairs', BehaviorXML), LEN(BehaviorXML))
FROM    AgentBehaviorTestArea
WHERE name = '$Name')
WHERE name = '$Name'
"
Invoke-Sqlcmd -Query $SQLCommand -ServerInstance $DBServer 
}

相关内容

  • 没有找到相关文章

最新更新