2012-07-24 71 views
1

我正在使用SQL更新查询[在powershell脚本中]更新列中存在的机器名称。如何只更新精确值匹配?

列值存储为URL。所以机器名称是字符串的一部分。

(柱名称:URL 实施例列的值: “HTTP:// MACHINE1:80/Impl100 /核心/数据/ Config.0”)

我使用下面的查询来执行更新。

$UpdateQuery="UPDATE [$DatabaseName].[dbo].[$TableName] 
SET $columnName=Replace("$ColumnName", '$OldMachineName', '$NewMachineName');" 

假设我的老机器名是“MACHINE1”和我与“AppMachine1”来代替。如果我执行脚本,它将更新“AppMachine1”。但是,如果我第二次执行该脚本,它将更新为“AppAppMachine1”,因为Machine1是AppMachine1的一部分。

是否可以在更新前获取列值并检查机器名称?

如何做到这一点?

+3

有更重的锚定令牌替换? ''// AppMachine1:'' – 2012-07-24 09:30:31

回答

1

试试这个

$UpdateQuery="UPDATE [$DatabaseName].[dbo].[$TableName] 
SET $columnName=Replace("$ColumnName", '$OldMachineName', '$NewMachineName') 
WHERE "$ColumnName" <> '$NewMachineName';" 
1

包括双领先斜线:

... -replace '//machine1','//AppAppMachine1' 

你也需要把引用变量在双引号。单引号禁用变量扩展,因此变量将不会被其值替换。

下面是一个双重的例子取代:

PS> $url = 'http://machine1:80/Impl100/Core/Data/Config.0' 
PS> $url -replace '//machine1','//AppAppMachine1' -replace '//machine1','//AppAppMachine1' 

http://AppAppMachine1:80/Impl100/Core/Data/Config.0 
+0

在这种情况下,如果机器在试验字符时发生变化,那么它将失败。例如。如果机器名称被替换为Machine123,那么如果我们执行第二次,它将是// Machine1231 – Samselvaprabu 2012-07-24 13:02:28

+0

糟糕,我在替换字符串中添加了双斜杠。 – 2012-07-24 13:11:58