invoke-sqlcmd пустая переменная

Я пытаюсь выполнить SQL-запрос, используя Invoke-SqlCmd запуск сценария в качестве входного файла, который содержит переменные SQLCMD, как $(varPROJECTNAME).

Например:CREATE DATABASE [$(varPROJECTNAME)$(varDBNAME)]В таком случае я хочу иметь возможность установить пустую строку как varPROJECTNAME значение.

Этот запрос будет успешно выполнен с классическим инструментом SQLCMD, но с Invoke-SqlCmd, я получаю ошибку, переменная сценария varPROJECTNAME не определена.

Invoke-Sqlcmd  -Username $LoginSQL -Password $PasswordSQL -ServerInstance $InstanceSQL -Verbose  -InputFile "$rootPackage\DB\UpdateDB\00-initSql\00-SubsTechCreateDatabase.sql"  -Variable "varPROJECTNAME=$projectName","varDBNAME=$DatabaseName"

В случае выше, если $projectName="", Будет ошибка

Можно ли установить значение по умолчанию, вызывая Invoke-SqlCmd, или с точки зрения сценария sql назначить значение по умолчанию для переменной, когда она не определена?

Большое спасибо заранее за вашу помощь

2 ответа

В вашем случае Invoke-SQLCommand Инструмент очень услужливо выполняет некоторую проверку ошибок, гарантируя, что все переменные, которые вы здесь определили, передаются в SQL для настройки вашей базы данных именно так.

Я хотел бы предложить изменение, давайте добавим логику в ваш скрипт, чтобы увидеть, если вы указали $ProjectName значение, и если так, передайте это значение. Если нет, выполните немного другую команду вместо этого.

If($projectName -ne $null){
 $variables = "varPROJECTNAME=$projectName","varDBNAME=$DatabaseName"
   }
 else{
 $variables = "varDBNAME=$DatabaseName"
  }

Invoke-Sqlcmd  -Username $LoginSQL -Password $PasswordSQL -ServerInstance $InstanceSQL `
  -Verbose  -InputFile "$rootPackage\DB\UpdateDB\00-initSql\00-SubsTechCreateDatabase.sql" `
  -Variable $variables

редактировать

Не могли бы вы попробовать этот пример вместо этого?

В своем текущем коде замените это

-Variable "varPROJECTNAME=$projectName"

с

-Variable "varPROJECTNAME=`"$($projectName)`""

Объединение с «»» в PowerShell, а затем проверка этого в SQL сработало для меня.

PowerShell:

      # coalesce command if undefined, whitespace or empty
if ("$($step.command)".Trim().Length -eq 0) {
    $command = '""'
} else {
    $command = $($step.command)
}

$variables = @(
    "job_name=$($job.name)",
    "step_name=$($step.name)",
    "step_id=$($step.id)",
    "package_path=$($step.package)",
    "command=$command",
    ...
)

Invoke-Sqlcmd -InputFile "$PSScriptRoot\upsert_job_step.sql" -Variable $variables -ConnectionString $connString -Verbose -OutputSqlErrors $true

SQL:

      DECLARE @command varchar(2047) = CASE
  WHEN NULLIF(TRIM('$(command)'), '""') IS NOT NULL
  THEN '$(command)'
  ELSE  FORMATMESSAGE('/ISSERVER "\"\SSISDB\$(package_path)\"" /ENVREFERENCE %i ..., @referenceId)
END;

Значение может быть любым (например, undefinedили же null) он просто должен быть одинаковым в обоих сценариях.

Другие вопросы по тегам