如何从powershell执行sqlcmd?

How to execute sqlcmd from powershell?

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

这是 sql.sql

1
2
3
select @@servername
go
select @@servicename

这是我从 cmd.exe

执行 sqlcmd 命令时的结果

1
2
3
4
5
6
7
8
9
10
11
12
13
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 脚本。

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

Invoke-Command $sql

当我执行这个 powershell 脚本时,我得到了以下错误。

1
2
3
4
5
6
7
8
9
10
11
12
13
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


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

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

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

Invoke-Sqlcmd is a SQL Server cmdlet that runs scripts that contain statements from the languages (Transact-SQL and XQuery) and commands that are supported by the sqlcmd utility

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

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

请参阅运行 SQL Server PowerShell

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


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

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

然后您可以在其中使用 $args 变量,甚至可以远程启动它。

1
2
3
4
5
$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"

备注:

这允许评论每个参数。

注意不要忘记 "`" 并且在它们之后的行尾没有空格。


使用 Invoke-Expression 而不是 Invoke-Command


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

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

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


这对我来说是在 powershell 脚本中使用 sqlcmd 使用的


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

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