运行多个* .sql查询文件日志到文件

时间:2016-09-16 03:50:51

标签: sql-server powershell

我的目标是让PowerShell脚本针对特定SQL服务器运行多个Sqlquery.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获取换行符,但宝贝现在就步了。

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

2 个答案:

答案 0 :(得分:1)

日志文件中没有任何内容的主要原因是Output-File在每次运行时都会重写其中的整个数据。尝试使用TechSpud回答中提到的-Verbose来收集打印/服务器语句,或将输出写入临时文件并将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"
}

答案 1 :(得分:0)

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

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

Get-Help Invoke-Sqlcmd -Full
  

Invoke-Sqlcmd不会返回SQL Server消息输出,例如   输出PRINT语句,除非使用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"
}