【问题标题】:invoke-sqlcmd empty variable调用-sqlcmd 空变量
【发布时间】:2017-12-01 21:13:44
【问题描述】:

我正在尝试使用 Invoke-SqlCmd 启动脚本作为包含 SQLCMD 变量的输入文件执行 SQL 查询,如 $(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 脚本的角度,在变量未定义时为其分配默认值?

非常感谢您的帮助

【问题讨论】:

  • 我们可能还需要更多的描述和代码,这个问题很不清楚
  • sqlcmd.exe 不喜欢你这样做:sqlcmd -Q "SELECT '$(var)'" -> "'var' scripting variable not defined." 无论如何它都会继续,保持变量没有任何替换,字面意思是$(var)(除非你传递了-b,然后批处理被中止,没有任何反应,与Invoke-SqlCmd 相同)。依赖这个是不明智的。如果您必须这样做,我建议您识别变量并显式传递空值。
  • 其实就是这个问题,用SQLCMD传递空变量就行了;在您的情况下,如果 var=='' 它是一个空字符串,将在执行的查询中使用。使用 Invoke-SqlCmd,查询根本不会运行,尽管我将变量显式设置为 ''
  • invoke-sqlcmd 'SELECT $(var)' -Variable "var=''" -> 没有错误。您必须提供失败的代码。
  • invoke-sqlcmd 'SELECT $(var)' -Variable "var=" 在我的情况下会失败;抱歉,我不清楚

标签: powershell invoke-sqlcmd


【解决方案1】:

在您的情况下,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)`""

【讨论】:

  • 这是行不通的,因为如果您未指定变量,整个命令将失败。只要.sql 包含$(varPROJECTNAME),就必须显式传递。
  • 在这个例子中,我们只传递带值的变量。请注意,第 2 行同时传递了 varProjectName 和 varDBName,而第 5 行仅提供了 varDBName 的值。这应该可以解决您的问题。
  • 不,Jeroen 是对的,你的提议只会解决你的 powershell 问题,但是脚本不会运行,因为 SQL 端没有设置 varPROJECTNAME
  • 哦,所以你是说你的 SQL 脚本 .SQL 文件可能有一个空值 varPROJECTNAME?你能试试第二个例子吗?
  • @FoxDeploy,谢谢你的建议,我试过了,但没有成功
猜你喜欢
  • 2016-05-11
  • 1970-01-01
  • 2013-04-25
  • 2013-05-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多