如何从powershell执行sqlcmd?

时间:2012-03-15 04:37:11

标签: powershell sqlcmd

我在powershell中有一个字符串,其中包含一个本机sqlcmd命令。命令本身可以在cmd.exe中成功执行。我很难在powershell中执行它们。有人可以帮忙吗?感谢。

这是sql.sql

select @@servername
go
select @@servicename

这是我从cmd.exe执行sqlcmd命令时的结果

C:\Users\test>sqlcmd -S "(local)\instance1" -U a -P a -i "c:\temp\sql.sql"

--------------------------------------------------
thesimpsons\INSTANCE1

(1 rows affected)

--------------------------------------------------
INSTANCE1

(1 rows affected)

C:\Users\test>

这是用于调用sqlcmd命令的powershell脚本。

$sql = @"
sqlcmd -S "(local)\instance1" -U a -P a -i "c:\temp\sql.sql"
"@

Invoke-Command $sql

当我执行此PowerShell脚本时,出现以下错误。

PS C:\TEMP> $sql = @"
sqlcmd -S "(local)\instance1" -U a -P a -i "c:\temp\sql.sql"
"@

Invoke-Command $sql
Invoke-Command : Parameter set cannot be resolved using the specified named parame
ters.
At line:5 char:15
+ Invoke-Command <<<<  $sql
    + CategoryInfo          : InvalidArgument: (:) [Invoke-Command], ParameterBin 
   dingException
    + FullyQualifiedErrorId : AmbiguousParameterSet,Microsoft.PowerShell.Commands 
   .InvokeCommandCommand

7 个答案:

答案 0 :(得分:22)

要调用Win32可执行文件,您需要使用调用运算符&,如下所示:

& sqlcmd -S "(local)\instance1" -U a -P a -i "c:\temp\sql.sql"

答案 1 :(得分:17)

您也可以停止使用外部&#39; SQLCMD.EXE&#39;并使用Invoke-Sqlcmd cmdlet代替:

  

Invoke-Sqlcmd是一个SQL Server cmdlet,它运行包含语言语句(Transact-SQL和XQuery)的脚本以及sqlcmd实用程序支持的命令

只需打开&#39; sqlps&#39;实用程序并运行

Invoke-Sqlcmd -InputFile "C:\temp\sql.sql"

请参阅Running SQL Server PowerShell

在使用&#39; Invoke-Sqlcmd&#39;;之前,您还可以在PowerShell中手动加载SQL Server管理单元。 对于MS SQL Server 2012,您可以通过运行
来实现 Import-Module SqlPs

答案 2 :(得分:5)

这就是我在脚本中构建一些外部命令的方法

$scriptblock = {fullpath\sqlcmd -S `"(local)\instance1`" <# comment option -S #>`
                                -U a `
                                -P a `
                                -i `"c:\temp\sql.sql`" }
Invoke-Command -ScriptBlock $scriptBlock

然后你可以在里面使用$ args变量,甚至可以远程启动它。

$scriptblock = {fullpath\sqlcmd -S `"(local)\instance1`" <# comment option -S #>`
                                -U a `
                                -P a `
                                -i `"$($args[0])`" }
Invoke-Command -ScriptBlock $scriptBlock -argumentList "c:\temp\sql.sql" -computer "remote1"

备注:

这允许对每个参数进行评论。

小心不要忘记“`”,并且在它们位于线的末尾之后没有空格。

答案 3 :(得分:3)

使用Invoke-Expression而不是Invoke-Command

答案 4 :(得分:2)

invoke-command的第一个位置参数是-scriptblock,它需要一个脚本块参数。要利用here-string构建命令然后使用invoke-command运行它,您需要将here-string转换为脚本块:

$sql = @"
sqlcmd -S "(local)\instance1" -U a -P a -i "c:\temp\sql.sql"
 "@

 Invoke-Command ([scriptblock]::create($sql))

答案 5 :(得分:0)

实例名称和用户名都应该是完全限定的

<domain_name>\Instanc_name<domai_name>\Username。只有您的实例名称才能正确编写脚本。

答案 6 :(得分:0)

对于我来说,使用&amp ;;在PowerShell脚本中使用sqlcmd是有用的。运算符,请参阅示例以生成csv文件:

  

&安培; cmd / c“sqlcmd -S $ sv -i $ PROCFILE -s,-v varDB = $ dbclean -o $ filename”

$sv的服务器名称类似于SERVERNAME\INSTANCE

$PROCFILEd:\TSTSQL\Sqlquery.SQL

类似

$filenamed:\TSTSQL\Desiredoutfilename.CSV

$dbclean是传递给sql文件的参数