使用 Powershell 从 SQL 脚本中删除多余的 GO

Remove redundant GOs from SQL script using Powershell

在通过 Invoke-sqlcmd 进行部署之前,我需要从大型 SQL 文件中删除冗余的 GO 语句。 多个 GO 语句一起导致 "There are no batches in the input script" 并使用 -OutputSqlErrors $false 掩盖所有其他错误。

Get-Unique 删除所有重复数据 - 这是不可取的。我只想删除重复的 GO 语句

当前脚本:

Exec (@SQLScript)
Print @SQLScript
End
GO
GO

if obj is not null
    drop procedure 
go

CREATE PROC 
    @al varchar(16),
    @rule      varchar(128)
END CATCH
GO
GO

If Exists (Select * From Table)
Go 
    Set @Start = DateAdd(m, 1, @Start)
End 
GO
GO

我想要这样的脚本:

Exec (@SQLScript)
Print @SQLScript
End
GO

if obj is not null
    drop procedure 
go

CREATE PROC 
    @al varchar(16),
    @rule      varchar(128)
END CATCH
GO

If Exists (Select * From Table)
Go 
    Set @Start = DateAdd(m, 1, @Start)
End 
GO

如果将脚本加载到变量中,可以使用正则表达式来匹配和替换多个"GO"语句。例如:

$ReplacedText = $OriginalScript -replace '(GO(\n)*){2,}',"GO`n"

正则表达式匹配 "GO" 后跟换行符 2 次或更多次。并将其替换为单个 "GO" 后跟一个新行。