'invoke-sqlcmd empty variable
I am trying to perform an SQL query using Invoke-SqlCmd
launching script as inputfile which contains SQLCMD variables, as $(varPROJECTNAME).
For example:
CREATE DATABASE [$(varPROJECTNAME)$(varDBNAME)]
In such a case, i want to be able to set an empty string as varPROJECTNAME
value.
This request will run successfully with classical SQLCMD tool, but with Invoke-SqlCmd, i get error, script variable varPROJECTNAME is undefined.
Invoke-Sqlcmd -Username $LoginSQL -Password $PasswordSQL -ServerInstance $InstanceSQL -Verbose -InputFile "$rootPackage\DB\UpdateDB\00-initSql\00-SubsTechCreateDatabase.sql" -Variable "varPROJECTNAME=$projectName","varDBNAME=$DatabaseName"
In case above, if $projectName=""
, There will be an error
Is it possible to set a default value calling Invoke-SqlCmd, or from sql script point of view, assign a default value to the variable when it's undefined?
Many thanks in advance for your help
Solution 1:[1]
In your case, the Invoke-SQLCommand
tool is very helpfully running some error checking, ensuring that all of the variables which you've defined here are passed along to SQL to setup your database just so.
I would propose a change, let's add some logic to your script to see if you've specified a $ProjectName
value, and if so, pass that value along. If not, run a slightly different command instead.
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
Edit
Could you try this example instead?
In your current code, replace this
-Variable "varPROJECTNAME=$projectName"
with
-Variable "varPROJECTNAME=`"$($projectName)`""
Solution 2:[2]
Coalescing to '""' in PowerShell and then checking for that in SQL worked for me.
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;
The value can be anything (say undefined
or null
) it just needs to be the same in both scripts.
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
Solution | Source |
---|---|
Solution 1 | |
Solution 2 |