我正在尝试从 PowerShell 运行存储在文本文件中的查询。我使用以下来做到这一点;
Invoke-Expression 'sqlcmd -d TestDB -U $user -P $pw -i "E:\SQLQuery1.sql"'
如果从文件执行查询时发生错误或异常.sql
,我如何在我的 Powershell 脚本中捕获它?如何获得脚本输出?
注意:我不能使用invoke-sqlcmd
我正在尝试从 PowerShell 运行存储在文本文件中的查询。我使用以下来做到这一点;
Invoke-Expression 'sqlcmd -d TestDB -U $user -P $pw -i "E:\SQLQuery1.sql"'
如果从文件执行查询时发生错误或异常.sql
,我如何在我的 Powershell 脚本中捕获它?如何获得脚本输出?
注意:我不能使用invoke-sqlcmd
回答问题
如果在执行 .sql 文件时发生了一些错误或异常,我如何才能将其放入我的 PowerShell 脚本中?我怎样才能得到脚本输出?”
Invoke-Expression
返回执行的表达式的输出。但是,它可能只捕获STDOUT
,而不是STDERR
(我没有测试过,因为我不使用这种方法),所以您可能不会收到实际的错误消息。
从帮助:
Invoke-Expression cmdlet 计算或运行指定字符串作为命令并返回表达式或命令的结果
更好的方法是使用您已有的 PowerShell 方法 -Invoke-SQLCmd
如果您安装了任何 SQL Server 2008(或更新的)组件/工具(如 SSMS),则安装该方法。如果您有 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
用来拾取和处理发生的任何错误。
从这个问题的答案中可以看出,Powershell 中内置了一种调用 SQLCMD 的方法,不出所料,Invoke-Sqlcmd
.
它非常容易用于单个文件:
Invoke-sqlcmd -ServerInstance $server -Database $db -InputFile $filename
或组:
$listOfFiles | % { Invoke-sqlcmd -ServerInstance $server -Database $db -InputFile $_ }
使用invoke-sqlquery
模块,可在本网站获得。