2013-08-08 57 views
7

Tôi đang cố gắng chạy truy vấn được lưu trữ trong tệp văn bản từ PowerShell. Tôi sử dụng sau đây để làm điều đó;Chạy tệp tập lệnh SQL từ PowerShell

Invoke-Expression 'sqlcmd -d TestDB -U $user -P $pw -i "E:\SQLQuery1.sql"' 

Nếu một lỗi hoặc ngoại lệ xảy ra khi thực hiện các truy vấn từ các tập tin .sql, làm thế nào tôi có thể nắm bắt được rằng trong kịch bản Powershell của tôi? Làm thế nào tôi có thể nhận được đầu ra kịch bản?

Chú ý: Tôi không thể sử dụng invoke-sqlcmd

+5

Tại sao các bạn sử dụng 'Gọi-Expression'? Chỉ cần gọi sqlcmd như bình thường. 'PS> sqlcmd.exe -d TestDB -U $ người dùng -P $ pw -I E: \ SQLQuery.sql1'. Nếu bạn thấy "lỗi hoặc ngoại lệ", vui lòng đăng toàn bộ nội dung của lỗi hoặc ngoại lệ này. – latkin

+2

Bạn cũng có thể giải thích lý do tại sao bạn không thể sử dụng invoke-sqlcmd. Có thể có một cách giải quyết khác. – noam

+0

+1 khi cần giải thích về 'invoke-sqlcmd'.IIRC, nếu bạn có một hệ thống nơi 'sqlcmd' được cài đặt, bạn cũng sẽ có' invoke-sqlcmd' (miễn là nó là công cụ từ SQL Server 2008+) – alroc

Trả lời

9

Để trả lời câu hỏi

Nếu một số lỗi hoặc ngoại lệ xảy ra khi thực hiện tập tin sql làm thế nào tôi có thể nhận được rằng vào kịch bản PowerShell của tôi? Làm thế nào tôi có thể nhận được đầu ra kịch bản?"

Invoke-Expression trả về kết quả của biểu thức thực hiện. Tuy nhiên, nó chỉ có thể chụp STDOUT, không STDERR (Tôi đã không kiểm tra, như tôi đã không sử dụng phương pháp này) , vì vậy bạn có thể không nhận được thông báo lỗi thực tế

Từ Trợ giúp:.

lệnh Invoke-biểu đánh giá hoặc điều hành một chuỗi quy định như một lệnh và trả về kết quả của biểu thức hay lệnh

Tuyến đường tốt hơn là sử dụng phương pháp PowerShell bạn đã có sẵn - Invoke-SQLCmd được cài đặt nếu bạn đã cài đặt bất kỳ thành phần/công cụ SQL Server 2008 (hoặc mới hơn) (như SSMS). Nếu bạn đã có SQL Server 2012, nó rất dễ dàng: import-module sqlps. Trong năm 2008, bạn cần thêm một Snap-In, add-pssnapin SqlServerCmdletSnapin. Và vì bạn có sqlcmd.exe, các thành phần PowerShell sẽ có sẵn.

Nếu vẫn thất bại, đi theo tuyến đường System.Data.SQLClient:

$Conn=New-Object System.Data.SQLClient.SQLConnection "Server=YOURSERVER;Database=TestDB;User Id=$user;password=$pw"; 
$Conn.Open(); 
$DataCmd = New-Object System.Data.SqlClient.SqlCommand; 
$MyQuery = get-content "e:\SQLQuery1.sql"; 
$DataCmd.CommandText = $MyQuery; 
$DataCmd.Connection = $Conn; 
$DAadapter = New-Object System.Data.SqlClient.SqlDataAdapter; 
$DAadapter.SelectCommand = $DataCmd; 
$DTable = New-Object System.Data.DataTable; 
$DAadapter.Fill($DTable)|Out-Null; 
$Conn.Close(); 
$Conn.Dispose(); 
$DTable; 

Với cả hai này và Invoke-SQLCmd, bạn sẽ có thể sử dụng try/catch để nhận và xử lý bất kỳ lỗi xảy ra.

+0

Xem tại đây nếu bạn có ** GO ** trong tuyên bố của bạn: https://stackoverflow.com/a/25681013/1747983 – Tilo

7

Như đã thấy trong this question's answers, có một phương pháp được tích hợp vào Powershell để gọi SQLCMD được gọi là, không đáng ngạc nhiên, Invoke-Sqlcmd.

Nó rất dễ dàng để sử dụng cho các tập tin cá nhân:

Invoke-sqlcmd -ServerInstance $server -Database $db -InputFile $filename 

Hoặc nhóm:

$listOfFiles | % { Invoke-sqlcmd -ServerInstance $server -Database $db -InputFile $_ } 
Các vấn đề liên quan