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”
————————————————– (1 rows affected) ————————————————– (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 |
- 相关: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
|
Invoke–Sqlcmd –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“ “@ Invoke–Command ([scriptblock]::create($sql)) |
- 这一切要做的就是返回 $sql 中的值,它实际上不会执行它(至少不在我的机器上)。
这对我来说是在 powershell 脚本中使用 sqlcmd 使用的
实例名称和用户名都应该是完全限定的
<domain_name>\\Instanc_name 和 <domai_name>\\Username。只有您的实例名称是正确的脚本。
来源:https://www.codenong.com/9714054/