Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/powershell/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何从powershell执行sqlcmd?_Powershell_Sqlcmd - Fatal编程技术网

如何从powershell执行sqlcmd?

如何从powershell执行sqlcmd?,powershell,sqlcmd,Powershell,Sqlcmd,我在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" ------

我在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
PS C:\TEMP>$sql=@”
sqlcmd-S“(本地)\instance1“-U a-P a-i”c:\temp\sql.sql”
"@
调用命令$sql
Invoke命令:无法使用指定的命名参数解析参数集
特尔斯。
第5行字符:15

+调用命令使用
Invoke Expression
而不是
Invoke Command

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

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

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

$scriptblock = {fullpath\sqlcmd -S `"(local)\instance1`" <# comment option -S #>`
                                -U a `
                                -P a `
                                -i `"c:\temp\sql.sql`" }
Invoke-Command -ScriptBlock $scriptBlock
$scriptblock={fullpath\sqlcmd-S`(本地)\instance1`”`
-U a`
-P a`
-i`“c:\temp\sql.sql`}
调用命令-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"
$scriptblock={fullpath\sqlcmd-S`(本地)\instance1`”`
-U a`
-P a`
-i`“$($args[0])`}
调用命令-ScriptBlock$ScriptBlock-argumentList“c:\temp\sql.sql”-计算机“remote1”
备注:

这允许对每个参数进行注释


注意不要忘记一个“`”,并且在它们后面没有空格,因为它们位于行的末尾

invoke命令的第一个位置参数是-scriptblock,它需要一个脚本块参数。要利用here字符串生成命令,然后使用invoke命令运行该命令,需要将here字符串转换为脚本块:

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

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

您也可以停止使用外部“SQLCMD.EXE”,而改用:

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

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

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

在使用“Invoke Sqlcmd”之前,您还可以在PowerShell中手动加载SQL Server管理单元
对于MS SQL Server 2012,您可以通过运行

导入模块SqlPs

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


\Instanc\u name
\Username
。只有您的实例名称的脚本编写正确。

这是我在powershell脚本中使用sqlcmd的有效方法,使用&operator,请参阅生成csv文件的示例:

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

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

$PROCFILE
类似于
d:\TSTSQL\Sqlquery.SQL

$filename
d:\TSTSQL\Desiredoutfilename.CSV


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

我不明白为什么人们在调用Win32可执行文件时会尝试使用调用表达式。。。这就是调用运算符的作用。@Andy-Invoke表达式允许您首先以字符串形式生成整个命令,这可能会根据具体情况而有所帮助。看,是的,但这不是在这里发生的。只有在需要计算表达式时才使用Invoke Expression。所要做的只是返回$sql中的值,它实际上不会执行它(至少不会在我的机器上)。相关:Andi Arismendi的答案很好,直接回答了sqlcmd可执行文件的执行,我相信这应该是公认的答案。如果您通过powershell运行sqlcmd脚本,只需使用Invoke sqlcmd.1即可节省时间、精力和击键次数。调用Sqlcmd不会实现Sqlcmd可用的所有命令。2.基本Powershell installInvoke Sqlcmd中不包含Invoke Sqlcmd。Invoke Sqlcmd会在存储过程的末尾添加分号,这会导致比较工具出现问题。请参阅,更不用说,Powershell 2.0不支持调用Sqlcmd。