从powershell运行SQL脚本文件

New*_*per 8 powershell

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

Invoke-Expression 'sqlcmd -d TestDB -U $user -P $pw -i "E:\SQLQuery1.sql"'
Run Code Online (Sandbox Code Playgroud)

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

注意:我不能使用 invoke-sqlcmd

alr*_*roc 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;
Run Code Online (Sandbox Code Playgroud)

通过这两者Invoke-SQLCmd,您将能够使用它try/catch来拾取和处理发生的任何错误.


Ale*_*lex 10

正如在这个问题的答案中看到的那样,Powershell内置了一个调用SQLCMD的方法,不出所料Invoke-Sqlcmd.

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

Invoke-sqlcmd -ServerInstance $server -Database $db -InputFile $filename
Run Code Online (Sandbox Code Playgroud)

或团体:

$listOfFiles | % { Invoke-sqlcmd -ServerInstance $server -Database $db -InputFile $_ } 
Run Code Online (Sandbox Code Playgroud)


Jim*_*mbo 2

使用此网站invoke-sqlquery上提供的模块。