8

我正在尝试从 PowerShell 运行存储在文本文件中的查询。我使用以下来做到这一点;

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

如果从文件执行查询时发生错误或异常.sql,我如何在我的 Powershell 脚本中捕获它?如何获得脚本输出?

注意:我不能使用invoke-sqlcmd

4

3 回答 3

11

回答问题

如果在执行 .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用来拾取和处理发生的任何错误。

于 2013-08-08T13:02:39.097 回答
10

这个问题的答案中可以看出,Powershell 中内置了一种调用 SQLCMD 的方法,不出所料,Invoke-Sqlcmd.

它非常容易用于单个文件:

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

或组:

$listOfFiles | % { Invoke-sqlcmd -ServerInstance $server -Database $db -InputFile $_ } 
于 2014-04-23T11:52:59.693 回答
2

使用invoke-sqlquery模块,可在本网站获得。

于 2013-08-08T12:34:16.973 回答