我最近在玩这个问题。就我而言,我的变量内部带有点和空格。我将列出我试图让它运行的所有组合。
测试 SQL 文件 test.sql
declare @testvar varchar(30);
set @testvar = '$(testvar)';
print @testvar;
我的测试变量集:
$varA = 'Abc1.3,Abc4.3' # contains only dots
$varB = 'A bc1.3,Ab c4.3' # contains dots and spaces
$varC = 'xx x.yy,y,.1.2.,3 , y' # contains dots and multiple spaces
sqlcmd命令的测试
sqlcmd -v testvar=`"$var`" -i test.sql
sqlcmd -v testvar=($var) -i test.sql
sqlcmd -v testvar=("""$var""") -i test.sql # Solution by Andrei Shakh
a) 测试#1
首先,我发现我的 powershell 脚本在包含空格的变量上返回错误
sqlcmd -v testvar=`"$varA`" -i test.sql
Abc1.3,Abc4.3
sqlcmd -v testvar=`"$varB`" -i test.sql
sqlcmd : Sqlcmd: 'testvar="A bc1.3,Ab c4.3""': Invalid argument. Enter '-?' for help. At line:2 char:1
b) 测试#2
终于找到了用括号代替双引号替换变量的解决方案,但是!
sqlcmd -v testvar=($varA) -i test.sql
sqlcmd : Sqlcmd: ',Abc4.3': Invalid argument. Enter '-?' for help. At line:1 char:1
sqlcmd -v testvar=($varB) -i test.sql
A bc1.3,Ab c4.3
有趣的是,我发现这个解决方案不适用于我的变量中的点。
c) 测试#3
我制作了一个脚本来匹配变量中的空格,在这种情况下使用括号,这两种方式都适用。
If ($var -match " ") # or ($var -like "* *")
{
sqlcmd -v testvar=($var) -i test.sql
}
Else
{
sqlcmd -v testvar=`"$var`" -i test.sql
}
d) 最终解决方案
到目前为止,我找到的最佳解决方案是Andrei Shakh在这里的回答,它适用于所有内容,而无需使用 IF/ELSE 语句来检查字符串中是否有空格。
sqlcmd -v testvar=("""$varA""") -i test.sql
Abc1.3,Abc4.3
sqlcmd -v testvar=("""$varB""") -i test.sql
A bc1.3,Ab c4.3
sqlcmd -v testvar=("""$varC""") -i test.sql
xx x.yy,y,.1.2.,3 , y