如何从powershell执行sqlcmd?

Jus*_*ner 20 powershell sqlcmd

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

这是sql.sql

select @@servername
go
select @@servicename
Run Code Online (Sandbox Code Playgroud)

这是从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>
Run Code Online (Sandbox Code Playgroud)

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

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

Invoke-Command $sql
Run Code Online (Sandbox Code Playgroud)

当我执行此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
Run Code Online (Sandbox Code Playgroud)

And*_*ndi 24

要调用Win32可执行文件,您需要使用这样的调用操作符&:

& sqlcmd -S "(local)\instance1" -U a -P a -i "c:\temp\sql.sql"
Run Code Online (Sandbox Code Playgroud)


use*_*531 18

您也可以停止使用外部'SQLCMD.EXE'并使用Invoke-Sqlcmd cmdlet:

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

只需打开'sqlps'实用程序并运行即可

Invoke-Sqlcmd -InputFile "C:\temp\sql.sql"
Run Code Online (Sandbox Code Playgroud)

请参阅运行SQL Server PowerShell

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

  • 1. Invoke-Sqlcmd没有实现SQLCMD可用的所有命令.2. Invoke-Sqlcmd未包含在基本Powershell安装中 (5认同)

JPB*_*anc 5

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

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

然后你可以在里面使用$ 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"
Run Code Online (Sandbox Code Playgroud)

备注:

这允许评论每个参数.

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