2012-03-15 25 views
13

Tôi có một chuỗi trong PowerShell, trong đó có một lệnh sqlcmd bản địa. Lệnh này có thể được thực thi thành công trong cmd.exe. Tôi gặp khó khăn trong việc thực hiện chúng trong PowerShell. Bất cứ ai cũng có thể giúp đỡ? Cảm ơn.Làm thế nào để thực hiện sqlcmd từ PowerShell?

Đây là sql.sql

select @@servername 
go 
select @@servicename 

Đây là kết quả khi tôi thực hiện lệnh sqlcmd từ 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> 

Đây là kịch bản PowerShell để gọi lệnh sqlcmd.

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

Invoke-Command $sql 

Khi tôi thực thi tập lệnh PowerShell này, tôi nhận được lỗi sau.

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

liên quan: http://stackoverflow.com/questions/1015038/powershell-sqlcmd –

Trả lời

18

Để gọi một thực thi Win32 bạn muốn sử dụng các nhà điều hành cuộc gọi & như thế này:

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

Sử dụng Invoke-Expression hơn Invoke-Command

+0

Tôi không thấy lý do tại sao mọi người cố gắng sử dụng Invoke-Expression khi gọi các tập tin thực thi Win32 ... Đây là những gì mà nhà điều hành cuộc gọi đang sử dụng. –

+0

@Andy - Invoke-Expression cho phép bạn tạo toàn bộ lệnh dưới dạng chuỗi đầu tiên, có thể hữu ích tùy thuộc vào hoàn cảnh. Xem http://stackoverflow.com/questions/6604089/dynamically-generate-command-line-command-then-invoke-using-powershell –

+1

Đúng, nhưng điều đó không xảy ra ở đây. Chỉ sử dụng Invoke-Expression khi có một biểu thức cần được đánh giá. –

5

Đây là cách tôi xây dựng một số externals lệnh trong kịch bản của tôi

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

Bạn có thể vi sử dụng biến $ args bên trong nó và thậm chí bắt đầu nó từ xa.

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

Ghi chú:

này cho phép nhận xét mỗi param.

Cẩn thận đừng quên "" và không có dấu cách sau khi chúng ở cuối dòng.

2

Tham số vị trí đầu tiên của lệnh gọi là -scriptblock và nó dự kiến ​​một đối số khối tập lệnh. Để tận dụng lợi thế của một đây-string để xây dựng các lệnh và sau đó chạy nó với invoke-lệnh, bạn cần phải chuyển đổi ở đây dây đến một khối kịch bản:

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

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

Tất cả điều này sẽ làm là trả về giá trị trong $ sql, nó sẽ không thực sự thực hiện nó (ít nhất là không phải trên máy của tôi). –

+0

Bạn nói đúng. Tôi sẽ cập nhật câu trả lời đó. – mjolinor

13

Bạn cũng có thể ngừng sử dụng bên ngoài 'SQLCMD .EXE' và sử dụng Invoke-Sqlcmd cmdlet thay vì:

Invoke-SQLCMD là một lệnh SQL Server chạy các kịch bản có chứa các báo cáo từ các ngôn ngữ (Transact-SQL và XQuery) và các lệnh được hỗ trợ bởi các tiện ích sqlcmd

Chỉ cần mở tiện ích 'sqlps' và chạy

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

Xin xem Running SQL Server PowerShell

Bạn cũng có thể nạp các snap-in SQL Server theo cách thủ công trong PowerShell trước khi sử dụng 'Invoke-Sqlcmd';
cho MS SQL Server 2012, bạn có thể làm điều đó bằng cách chạy
Import-Module SqlPs

+1

Trong khi câu trả lời của Andi Arismendi là câu trả lời hay nhất và trực tiếp trả lời việc thực thi sqlcmd, tôi tin rằng câu trả lời này là câu trả lời được chấp nhận. Nếu bạn đang chạy các kịch bản lệnh sqlcmd thông qua powershell, nó sẽ giúp bạn tiết kiệm thời gian, công sức và tổ hợp phím để đơn giản sử dụng Invoke-Sqlcmd. – ascary

+4

1. Invoke-Sqlcmd không thực hiện tất cả các lệnh có sẵn với SQLCMD. 2. Invoke-Sqlcmd không được bao gồm trong cài đặt Powershell cơ sở – DonBecker

+0

Invoke-Sqlcmd thêm dấu chấm phẩy vào cuối các thủ tục được lưu trữ, gây ra các vấn đề với các công cụ so sánh. Xem https://social.msdn.microsoft.com/Forums/sqlserver/en-US/74d8acd4-9788-48e5-93bc-fa165a573ee2/powershell-invokesqlcmd-adding-semicolon?forum=sqltools và https: //www.reddit .com/r/PowerShell/comments/5v29o2/options_for_executing_sql_server_script/ – kevinpo

0

Cả hai tên instance và tên người dùng phải đủ điều kiện

<domain_name>\Instanc_name<domai_name>\Username. Chỉ tên dụ của bạn được viết đúng.

0

Đây là những gì làm việc cho tôi sử dụng sqlcmd từ bên trong các kịch bản PowerShell bằng cách sử dụng toán tử &, xem mẫu để tạo ra một tập tin csv:

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

$sv có tên máy chủ như SERVERNAME\INSTANCE

$PROCFILE là như 01.

$filenamed:\TSTSQL\Desiredoutfilename.CSV

$dbclean là một tham số truyền cho các tập tin sql