【问题标题】:How to update only exact value matches?如何仅更新精确值匹配?
【发布时间】:2012-07-22 14:20:30
【问题描述】:

我正在使用 SQL 更新查询 [在 powershell 脚本中] 来更新列中存在的机器名称。

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

( 列名 : URL 列值示例:“http://Machine1:80/Impl100/Core/Data/Config.0”)

我正在使用以下查询进行更新。

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

假设我的旧机器名称是“Machine1”,我将替换为“AppMachine1”。如果我执行脚本,它将更新“AppMachine1”。但是,如果我第二次执行该脚本,它会将其更新为“AppAppMachine1”,因为 Machine1 是 AppMachine1 的一部分。

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

如何做到这一点?

【问题讨论】:

  • 替换为更锚定的令牌? '//AppMachine1:'

标签: sql sql-server sql-server-2008 powershell


【解决方案1】:

试试这个

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

【讨论】:

    【解决方案2】:

    包括双前导正斜杠:

     ... -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
    

    【讨论】:

    • 在这种情况下,如果机器在试用字符时发生更改,那么它将失败。例如。如果机器名称被替换为 Machine123 那么如果我们第二次执行它将是 //Machine1231
    • 糟糕,我在替换字符串中添加了双斜杠。
    猜你喜欢
    • 2021-03-19
    • 2022-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-07-01
    • 1970-01-01
    相关资源
    最近更新 更多