【问题标题】:How to execute sqlcmd from powershell?如何从powershell执行sqlcmd?
【发布时间】:2012-03-15 04:37:11
【问题描述】:

我在 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

【问题讨论】:

标签: powershell sqlcmd


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    您也可以停止使用外部的“SQLCMD.EXE”并改用Invoke-Sqlcmd cmdlet

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

    只需打开“sqlps”实用程序并运行

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

    请看Running 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/…
    • 更不用说,Invoke-Sqlcmd 在 Powershell 2.0 中不受支持。
    【解决方案3】:

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

    $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"
    

    备注:

    这允许评论每个参数。

    注意不要忘记一个“`”,并且在它们之后的行尾没有空格。

    【讨论】:

      【解决方案4】:

      使用Invoke-Expression 而不是Invoke-Command

      【讨论】:

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

      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))
      

      【讨论】:

      • 所有这一切都会返回 $sql 中的值,它不会真正执行它(至少不会在我的机器上)。
      【解决方案6】:

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

      &lt;domain_name&gt;\Instanc_name&lt;domai_name&gt;\Username。只有您的实例名称是正确的脚本。

      【讨论】:

        【解决方案7】:

        这对我来说是使用 & 运算符在 powershell 脚本中使用 sqlcmd 的方法,请参阅生成 csv 文件的示例:

        & cmd /c "sqlcmd -S $sv -i $PROCFILE -s, -v varDB = $dbclean -o $filename"

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

        $PROCFILE 就像d:\TSTSQL\Sqlquery.SQL

        $filenamed:\TSTSQL\Desiredoutfilename.CSV

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

        【讨论】:

          猜你喜欢
          • 2017-06-01
          • 2016-07-26
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2022-11-23
          • 2017-12-21
          • 1970-01-01
          相关资源
          最近更新 更多