如何从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
@

InvokeCommand $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
@

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

  • 相关:stackoverflow.com/questions/1015038/powershell-sqlcmd


要调用 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
InvokeSqlcmd InputFile“C:\\temp\\sql.sql”

请参阅运行 SQL Server PowerShell

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

  • 虽然 Andi Arismendi 的答案很好,并且直接回答了 sqlcmd 可执行文件的执行,但我相信这应该是公认的答案。如果您通过 powershell 运行 sqlcmd 脚本,则只需使用 Invoke-Sqlcmd 即可节省您的时间、精力和击键次数。
  • 1. Invoke-Sqlcmd 没有实现 SQLCMD 可用的所有命令。 2. Invoke-Sqlcmd 不包含在基本 Powershell 安装中
  • Invoke-Sqlcmd 在存储过程的末尾添加分号,这会导致比较工具出现问题。请参阅 social.msdn.microsoft.com/Forums/sqlserver/en-US/… 和 reddit.com/r/PowerShell/comments/5v29o2/…
  • 更不用说,Powershell 2.0 不支持 Invoke-Sqlcmd。


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

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

  • 我不明白为什么人们在调用 Win32 可执行文件时尝试使用 Invoke-Expression…这就是调用运算符的用途。
  • @Andy – Invoke-Expression 允许您首先将整个命令生成为字符串,根据具体情况,这可能很有用。请参阅stackoverflow.com/questions/6604089/…
  • 是的,但这不会发生在这里。仅当存在需要评估的表达式时才使用 Invoke-Expression。


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
@

 InvokeCommand ([scriptblock]::create($sql))

  • 这一切要做的就是返回 $sql 中的值,它实际上不会执行它(至少不在我的机器上)。


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


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

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


来源:https://www.codenong.com/9714054/

微信公众号
手机浏览(小程序)

Warning: get_headers(): SSL operation failed with code 1. OpenSSL Error messages: error:14090086:SSL routines:ssl3_get_server_certificate:certificate verify failed in /mydata/web/wwwshanhubei/web/wp-content/themes/shanhuke/single.php on line 57

Warning: get_headers(): Failed to enable crypto in /mydata/web/wwwshanhubei/web/wp-content/themes/shanhuke/single.php on line 57

Warning: get_headers(https://static.shanhubei.com/qrcode/qrcode_viewid_9677.jpg): failed to open stream: operation failed in /mydata/web/wwwshanhubei/web/wp-content/themes/shanhuke/single.php on line 57
0
分享到:
没有账号? 忘记密码?