我有一个数据库,在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
}