2012-03-15 95 views
13

我在powershell中有一個字符串,它包含一個本地sqlcmd命令。該命令本身可以在cmd.exe中成功執行。我很難在PowerShell中執行它們。任何人都可以幫忙謝謝。如何從powershell執行sqlcmd?

這是sql.sql

select @@servername 
go 
select @@servicename 

這是結果,當我從cmd.exe的

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腳本調用SQLCMD命令。

$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 
+0

相關參數:http://stackoverflow.com/questions/1015038/powershell-sqlcmd – 2013-01-31 12:35:02

回答

18

要調用Win32可執行程序要使用電話運營商&這樣的:

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

使用Invoke-Expression而不是Invoke-Command

+0

我不明白爲什麼人們嘗試在調用Win32可執行文件時使用Invoke-Expression ...這是調用操作符的用途。 – 2012-03-15 04:44:32

+0

@Andy - Invoke-Expression允許您首先將整個命令生成爲一個字符串,根據具體情況可能會有所幫助。看到http://stackoverflow.com/questions/6604089/dynamically-generate-command-line-command-then-invoke-using-powershell – 2012-03-15 04:49:05

+1

是的,但這不是在這裏發生。只有在需要評估表達式時才使用Invoke-Expression。 – 2012-03-15 04:50:30

5

這是我建立一些外部組件在我的腳本命令

$scriptblock = {fullpath\sqlcmd -S `"(local)\instance1`" <# comment option -S #>` 
           -U a ` 
           -P a ` 
           -i `"c:\temp\sql.sql`" } 
Invoke-Command -ScriptBlock $scriptBlock 

你可以th在它內部使用$ 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" 

備註:

這允許發表評論每個PARAM。

注意不要忘記「`」,並且在它們之後沒有空格的地方放在行尾。

2

invoke-command的第一個位置參數是-scriptblock,它需要一個腳本塊參數。採取下面的字符串的優勢,打造命令,然後與調用命令運行它,你需要將下面的字符串轉換爲一個腳本塊:

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

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

所有這一切將返回$ sql中的值,它不會真正執行它(至少不是在我的機器上)。 – 2012-03-15 14:37:48

+0

你說得對。我會更新這個答案。 – mjolinor 2012-03-15 15:32:30

13

你也可以停止使用外部「SQLCMD 。EXE」和使用Invoke-Sqlcmd cmdlet代替:

調用-SQLCMD是運行包含從由sqlcmd實用工具支持的語言(的Transact-SQL和XQuery)和命令語句的腳本一個SQL Server cmdlet的

只要打開「SQLPS的效用和運行

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

請參閱Running SQL Server PowerShell

在使用'Invoke-Sqlcmd'之前,您還可以在PowerShell中手動加載SQL Server管理單元;
爲MS SQL Server 2012中,你可以做到這一點通過運行
Import-Module SqlPs

+1

儘管Andi Arismendi的回答很好,並且直接回答了sqlcmd可執行文件的執行情況,但我相信這應該是被接受的答案。如果您通過PowerShell運行sqlcmd腳本,它將爲您節省時間,精力和擊鍵以簡化使用Invoke-Sqlcmd。 – ascary 2015-11-09 15:39:25

+4

1. Invoke-Sqlcmd不執行SQLCMD提供的所有命令。 2. Invoke-Sqlcmd未包含在基礎Powershell安裝中 – DonBecker 2016-07-15 22:01:22

+0

Invoke-Sqlcmd在存儲過程的最後添加了分號,這會導致比較工具出現問題。請參閱https://social.msdn.microsoft.com/Forums/sqlserver/en-US/74d8acd4-9788-48e5-93bc-fa165a573ee2/powershell-invokesqlcmd-adding-semicolon?forum=sqltools和https://www.reddit 。com/r/PowerShell/comments/5v29o2/options_for_executing_sql_server_script/ – kevinpo 2017-04-13 13:42:46

0

兩個實例的名稱和用戶名應該是完全合格的

<domain_name>\Instanc_name<domai_name>\Username。只有您的實例名稱正確編寫腳本。

0

這是爲我工作使用SQLCMD從使用&操作PowerShell腳本中,看樣,生成CSV文件:

& CMD/C「的sqlcmd -S $ SV -i $ PROCFILE -s,-v varDB = $ dbclean -o $文件名」

$sv有服務器名稱,如SERVERNAME\INSTANCE

$PROCFILEd:\TSTSQL\Sqlquery.SQL

$filenamed:\TSTSQL\Desiredoutfilename.CSV

$dbclean是傳遞給SQL文件