web-dev-qa-db-ja.com

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"

--------------------------------------------------
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
19
Just a learner

Win32実行可能ファイルを呼び出すには、次のように呼び出し演算子&を使用します。

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

外部の 'SQLCMD.EXE'の使用を停止し、代わりに Invoke-Sqlcmdコマンドレット を使用することもできます。

Invoke-Sqlcmdは、言語(Transact-SQLおよびXQuery)からのステートメントと、sqlcmdユーティリティでサポートされているコマンドを含むスクリプトを実行するSQL Serverコマンドレットです。

「sqlps」ユーティリティを開いて実行するだけです

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

SQL Server PowerShellの実行 を参照してください

「Invoke-Sqlcmd」を使用する前に、PowerShellでSQL Serverスナップインを手動で読み込むこともできます。
MS SQL Server 2012の場合は、次のコマンドを実行して実行できます
Import-Module SqlPs

17
user4531

これは、スクリプトで外部コマンドを作成する方法です

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

備考:

これにより、各パラメーターをコメント化できます。

行末にある「 `」を忘れずにスペースを忘れないように注意してください。

5
JPBlanc

使用する Invoke-Expression のではなく Invoke-Command

3
Andrew Shepherd

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

これは、&演算子を使用して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ファイルに渡されるパラメーターです

0
Jorge Besada

インスタンス名とユーザー名の両方が完全に修飾されている必要があります

<domain_name>\Instanc_nameおよび<domai_name>\Username。インスタンス名のみが正しくスクリプト化されます。

0
user2063329