SqllocalDB vコマンドでバージョンが表示されないときの対応
ローカルにインストールされているSQL Server Express LocalDB(以下LocalDB)のバージョン一覧を取得するためにSqlLocalDB v
コマンドを叩いた際に、Windows APIのエラーが返却される場合があった。
この事象の原因と対応方法について調べたところ、Stack Overflowにそのままの質疑応答があった。
但し日本語では検索で情報が出てこなかったのでメモを残す。
事象
インストールされているLocalDBのバージョン一覧を得るために以下のコマンドを実行する
> SqlLocalDB versions
しかし、以下のエラーが表示される。
Windows API の呼び出し "RegGetValueW" はエラー コードを返しました: 0。
原因
これは、レジストに登録されている情報にアンマッチが発生しているために発生している。
具体的には以下の二つのエントリを指す。
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server Local DB\Installed Versions
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server
自分のマシンで発生していた例では以下のようになっていた。
-
HKLM\SOFTWARE\Microsoft\Microsoft SQL Server Local DB\Installed Versions
は13.0
- これに対応する
HKLM\SOFTWARE\Microsoft\Microsoft SQL Serve\MSSQL13E.LOCALDB\MSSQMServer\CurrentVersion\CurrentVersion
は13.1
他にも自分が見た事例では、13.0と13.1または13.2で不一致になっているケースが散見された。エントリがこのようになる原因については今回調査していないが、恐らくはSQL Server Express 2016 LocalDBのサービスパックを適用するとインプレースでアップグレードされHKLM\SOFTWARE\Microsoft\Microsoft SQL Serveは以下のバージョンが更新されるために発生していると推測する。
対処方法
対処法①:SP3にする
Microsoft® SQL Server® 2016 Service Pack 3 Expressではこの事象に対処されているため、SP3を適用すれば解消する。
SP3を適用(実質的にアンインストール→インストール)すると、バージョンはMicrosoft SQL Server 2016 (13.0.6300.2)
となり、13.0
となる為レジストにアンマッチが発生せず従ってエラーも発生しなくなる。
SQL Server® 2016 Service Pack 3 Express LocalDBは https://www.microsoft.com/ja-jp/download/details.aspx?id=103447 からSQLServer2016-SSEI-Expr.exe
をダウンロードし実行、メニューから「メディアのダウンロード」-「LocalDB」と進み、ダウンロードされたSqlLocalDB.msiを実行することでインストール(インプレースアップグレード)可能。
対処法②:前述のレジストリのエントリを修正し、マッチさせれば事象は解消する。
事情によりSP3が適用できない場合はレジストリ値を修正することでも対応が可能。
HKLM\SOFTWARE\Microsoft\Microsoft SQL Server Local DB\Installed Versions
側のエントリでバージョンの2番目の項(minor version?)を以下のように一致させる。
備考・注意点
SqlLocalDB create
コマンドでLocalDBのインスタンス作成時にバージョンを指定する際はHKLM\SOFTWARE\Microsoft\Microsoft SQL Server Local DB\Installed Versions
で指定する必要がある。
参考
Discussion