运行多个* .sql查询文件登录到文件

问题描述:

我的目标是让PowerShell脚本针对特定的SQL服务器运行多个Sqlquery.sql文件,然后将输出记录到日志文件中。运行多个* .sql查询文件登录到文件

我无法使日志记录工作,我不知道我错过了什么。我的日志文件总是空的,我不知所措。

内容的C:\ TEMP:

Build1.SQL 
Build2.SQL 
Build3.sql 
Build4.sql 
Build5.SQL 
Build6.SQL
$PatchPostConvSQLScripts = Get-ChildItem -Path C::\Temp -Filter *.sql -Name 
$Queries = $PatchPostConvSQLScripts 
foreach ($query in $Queries){ 
    Write-Host "Starting: $query" 
    Invoke-Sqlcmd -ServerInstance $DBServer -InputFile $query | 
     Out-File "C:\TEMP\scriptResults.log" 
    Write-Host "Completed: $query" 
} 

一旦我得到它记录到文件,我需要每次都得到一个新行与`n`r,但宝宝现在几步之遥。

有没有更好的方法来做到这一点,我只是不知道?

+3

愚蠢的问题,但做你的脚本* *生成任何输出?也就是说,如果你在不将'invoke-sqlcmd'调用管道输出到'out-file'的情况下运行它们,屏幕上是否会输出? –

+2

你是否错过了Out-File的-append标志? –

首先,正如@Ben Thul在他的评论中提到的那样,通过在Management Studio中运行它们来检查SQL文件是否实际输出了一些内容(结果集或消息)。

然后,您需要使用-Verbose标志,因为此命令会告诉您。

Get-Help Invoke-Sqlcmd -Full 

调用-SQLCMD不返回SQL Server邮件输出,如打印语句的 输出,除非你使用PowerShell的-Verbose参数。

$Queries = Get-ChildItem -Path C::\Temp -Filter *.sql -Name 

Clear-Content -Path "C:\TEMP\scriptResults.log" -Force 

foreach ($query in $Queries){ 
    Write-Host "Starting: $query" 
    Invoke-Sqlcmd -ServerInstance $DBServer -InputFile $query -Verbose | 
     Add-Content -Path "C:\TEMP\scriptResults.log" 
    Write-Host "Completed: $query" 
} 

你有没有在日志文件中的主要原因是它在每次运行该Output-File重写整个数据。尝试使用-Verbose提到在回答通过TechSpud收集打印/ server语句,或将输出写入临时文件和Add-Content主日志文件:

$DBServer = "MYPC\SQLEXPRESS" 
$sqlPath = "C:\TEMP\" 
$log = "scriptResults.log" 
$tempOut = "temp.log" 

$files = Get-ChildItem -Path $sqlPath -Filter *.sql -Name 

foreach ($file in $files){ 
    Write-Host "Starting: $file" 
    Invoke-SQLcmd -ServerInstance $DBServer -InputFile $sqlPath$file | Out-File $sqlPath$tempOut 
    Get-Content $sqlPath$tempOut | Add-Content $sqlPath$log 
    Write-Host "Completed: $file" 
} 
+0

这让我到了我需要的地方。感谢您的帮助 –