在powershell脚本中将路径传递给SqlCmd

时间:2010-09-17 10:28:11

标签: powershell sqlcmd

我正在尝试编写一个powershell脚本,它将执行sqlcmd.exe来运行sql脚本。该脚本包含一个SQLCMD变量,我想通过sqlcmd的-v开关在命令行中传入该变量。问题是当我传递路径作为我的一个变量的值时,powershell做了一些奇怪的事情,这反过来导致SQL脚本失败。

例如我正在打电话:

$path = 'C:\path'
sqlcmd -SMySQLServerInstance  -i 'MySqlScript.sql'  -v MyVariablePath=$path

运行时收到错误消息:

Sqlcmd: ':\path': Invalid argument.

我在$pathMyVariablePath=$path周围尝试过双重或单引号的数量 解决了这个问题。

有人可以提供一个简单的规范示例,说明如何做到这一点吗?

4 个答案:

答案 0 :(得分:19)

终于解决了。对于下一个尝试这个的吸盘是解决方案

powershell脚本看起来像

$myPath = "`"C:\Path`"" 
sqlcmd.exe -SmySQLInstance -i./test.sql -v myvar=$myPath

我的test.sql文件可以使用像这样的变量

PRINT "$(myvar)"

这里的关键是理解powershell如何逃避角色。关于here

的更多信息

答案 1 :(得分:2)

如果出现同样的问题,偶然发现了解决方案,仍然不明白它的工作原理:)(虽然我不是PowerShell专业人士):

sqlcmd -d ... -s ... -v Var1Name=("""$PowershellVar1""") Var2Name=("""$PowershellVar2""")

变量$PowershellVar1$PowershellVar2在我的PS脚本中有字符串类型,可以包含引号,空格等

答案 2 :(得分:1)

您可以在this issue filed on the Microsoft connect site的“变通办法”标签上找到此问题的几个选项。当你在那里时请投票。

答案 3 :(得分:1)

我最近在玩这个问题。就我而言,我的变量中包含点和空格。我将列出我试图让它运行的所有组合。

测试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