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
) он просто должен быть одинаковым в обоих сценариях.