我正在尝试从PowerShell运行存储在文本文件中的查询。我用以下来做到这一点;
Invoke-Expression 'sqlcmd -d TestDB -U $user -P $pw -i "E:\SQLQuery1.sql"'
如果从.sql
文件执行查询时发生错误或异常,我该如何在我的Powershell脚本中捕获它?如何获取脚本输出?
注意:我无法使用invoke-sqlcmd
答案 0 :(得分:11)
回答问题
如果在执行.sql文件时发生了一些错误或异常,我该如何将其添加到我的PowerShell脚本中?如何获取脚本输出?"
Invoke-Expression
返回已执行表达式的输出。但是,它可能只捕获STDOUT
,而不是STDERR
(我没有经过测试,因为我不使用此方法),因此您可能无法获得实际的错误消息。< / p>
来自帮助:
Invoke-Expression cmdlet将指定的字符串作为命令计算或运行,并返回表达式或命令的结果
更好的方法是使用已有的PowerShell方法 - 如果已安装任何SQL Server 2008(或更新版本)组件/工具(如SSMS),则会安装Invoke-SQLCmd
。如果您拥有SQL Server 2012,那么非常简单:import-module sqlps
。对于2008年,您需要添加管理单元add-pssnapin SqlServerCmdletSnapin
。由于您拥有sqlcmd.exe
,因此PowerShell组件应该已存在。
如果所有其他方法都失败了,请转到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;
使用此Invoke-SQLCmd
和try/catch
,您就可以使用{{1}}来接收并处理发生的任何错误。
答案 1 :(得分:9)
如this question's answers所示,Powershell内置了一个调用SQLCMD的方法,不出所料,Invoke-Sqlcmd
。
它非常易于用于单个文件:
Invoke-sqlcmd -ServerInstance $server -Database $db -InputFile $filename
或小组:
$listOfFiles | % { Invoke-sqlcmd -ServerInstance $server -Database $db -InputFile $_ }
答案 2 :(得分:2)
使用this website上提供的invoke-sqlquery
模块。