Измените значение, возвращенное из Invoke-sqlcmd

#powershell

Вопрос:

Я искал уже несколько часов и не могу понять, как это сделать.

Я запрашиваю базу данных MSSQL, которая возвращает 2 столбца, одно из этих значений пустое/нулевое, но представляет что-то в базе данных SQL(я протестировал его отключение).

Как бы я проверил, что возвращается из моего запроса для пустого значения, и изменил это на что-то другое?

 $TestQuery = Invoke-Sqlcmd -Database $DB -Query $qcd -ServerInstance "SomeInstanceInstance1" -Verbose
 

Результат:

 Activity              Setting
--------              -------
All Operation         Enabled
Backup                Enabled
Restore               Enabled
Prune                 Enabled
Aux Copy              Enabled
Schedule              Enabled
Archive Check         Enabled
Tape Erase            Enabled
Offline content Index Enabled
Online Content Index  Enabled
                      Enabled
 

Вы можете видеть, что последний возвращенный элемент не имеет значения, но отражает настройку в приложении, которое мы используем, я просто хочу изменить это значение на «Значение 1», например.

Любая помощь очень признательна, я пробовал использовать хэш-таблицы, но понятия не имел, что делаю, несмотря на несколько часов поиска в Google.

Изменить: Мой запрос:

 SELECT JM.opName AS 'Activity',
    CASE action
    WHEN 1 THEN 'Disabled'
    WHEN 2 THEN 'Enabled'
    END AS 'Setting'
    FROM JMJobAction AS J
    LEFT JOIN JMJobOperationNames JM on JM.opType = J.opType
WHERE clientId = 1
    AND appType = 0
    AND J.opType != 8
    AND appId = 1
 

Ответ №1:

В PowerShell вы можете выполнить следующие действия:

 $TestQuery = Invoke-Sqlcmd -Database $DB -Query $qcd -ServerInstance "SomeInstanceInstance1"
$TestQuery |
    Where { [string]::IsNullOrEmpty($_.Activity) } | Foreach-Object {
        $_.Activity = 'Value1' # Update all empty or nulls with Value1
    }
$TestQuery # Contains updated results
 

Обратите внимание, что это не обновляет фактическую базу данных. Вам понадобится отдельный запрос, который будет выполнять обратную запись в базу данных.


Когда таблица базы данных содержит a NULL , она интерпретируется как System.DBNull тип данных в PowerShell. [System.DBNull]::Value это не то же $null самое, что . Поэтому, если вы хотите только запросить NULL значения, то ваш запрос можно было бы более уместно изменить следующим образом:

 $TestQuery | Where Activity -is [DBNUll]
 

Комментарии:

1. Я где-то читал, что значение DB Null-это не то же самое, что $null. Но большое вам спасибо, это решило проблему, с которой я столкнулся, я не мог понять, как это сделать в SQL — запросе, но это следующая лучшая вещь.

Ответ №2:

Я не знаю, правильно ли я понял ваш вопрос. Я понимаю, что вы хотите иметь значение по умолчанию, когда в столбце нет данных.

Это может быть решено в вашем SQL — запросе с case помощью . Вот пример

[Редактировать] На основе вашего добавленного запроса

 SELECT 
    CASE 
      WHEN JM.opName is null OR JM.opName = '' THEN "DefaultActivity" 
      ELSE JM.opName
    END AS Activity,
    CASE action
       WHEN 1 THEN 'Disabled'
       WHEN 2 THEN 'Enabled'
    END AS 'Setting'
FROM JMJobAction AS J
    LEFT JOIN JMJobOperationNames JM on JM.opType = J.opType
WHERE clientId = 1
    AND appType = 0
    AND J.opType != 8
    AND appId = 1

 

Комментарии:

1. Поэтому я не уверен, как добавить это в свой запрос, я добавил свой запрос в свой первый пост, я просто продолжаю нарушать запрос

2. Привет @Майк, я обновил свой ответ. К сожалению, я не могу это проверить, у меня нет такой базы данных 🙂 но попробуйте и дайте мне знать, если будут ошибки