SQL Server 間のデータベース移行 / バージョンアップを実施する際のアセスメントに使用することができるツールとして Data Migration Assistant が提供されています。
DMA を使用することで環境が変更されたことによる機能互換性と、データベースの互換性レベルを変更した場合の影響を確認することができ、データベースの互換性レベルを変更した場合の影響調査には、「構文チェック」が行われています。
この構文チェックでは、「DMA に内包されているルールによるチェック」と「一般的な構文チェック」の二種類が行われているようなのですが、後者の「一般的な構文チェック」がどのように実施されているのか (どの程度網羅性があるのか) が気になったので、方式を確認してみました。
DMA の一般的な構文チェックには、ScriptDom の Parse 機能が使用されているようです。
ScriptDom のパース用のクラスは互換性レベルごとに提供が行われており、調査したい互換性レベルのクラスを使用して Parse を行うことで、構文解析をすることができます。
ScriptDom のインストール方法はいくつかあると思いますが、DMA をインストーすると同梱されていますので、これを使用して次のようなスクリプトで構文チェックを行うことができます。
$scritDomFilePath = "C:\Program Files\Microsoft Data Migration Assistant\Microsoft.SqlServer.TransactSql.ScriptDom.dll"
Add-Type -Path $scritDomFilePath
$query = @"
create procedure usp_02
as
begin
select top 10 * from person.Address AS MERGE
end
go
"@
$errors = New-Object "System.Collections.Generic.List[Microsoft.SqlServer.TransactSql.ScriptDom.ParseError]"
$parser = New-Object Microsoft.SqlServer.TransactSql.ScriptDom.TSql150Parser($false)
$resulsts = $parser.Parse([System.IO.StringReader]::new($query), [ref]$errors)
if($errors -ne $null){
Write-Output $errors
}
実行されている内容は、SSMS の解析の機能に近いのではないでしょうか。