トップ回答者
sqlインスタンスの列挙

質問
回答
-
SQLBrowserサービスの状態にかかわらず、せめてローカルPC内のインスタンスは正確に取得してほしいのですが、方法はありますでしょうか。
ローカルで、SQL Server 2005以降である場合、すごく負けた気がする(≒今後のバージョンでどうなるかわからない)けれども、以下を使ってます。
gsv | ? {$_.DisplayName -match '^SQL Server \('} | ? {$_.status -eq "running"} | Select-Object DisplayName
- 回答としてマーク OTAKA 2010年9月22日 5:26
すべての返信
-
今回とは関係ないと思いますが、この関数は非常に気持ち悪く、ローカルマシンの場合、SQL Browserサービスが動いていればSQL Server EXPRESS(というか、動的ポートを設定しているインスタンス)、サービスが停止していれば既定のインスタンス(1433/tcpで動作していインスタンス)が表示されます。
SQL Server Management Studioで、「接続」⇒サーバ名⇒サーバーの参照⇒「ネットワーク サーバー」の一覧に表示されるものと同じです。以下の資料に書かれている通り、微妙に信用なりません^^;
「SqlDataSourceEnumerator.GetDataSources メソッド (System.Data.Sql)」
http://msdn.microsoft.com/ja-jp/library/system.data.sql.sqldatasourceenumerator.getdatasources(v=VS.100).aspx -
ご返事ありがとうございます。
>今回とは関係ないと思いますが、この関数は非常に気持ち悪く、ローカルマシンの場合、SQL Browserサービスが動い>ていればSQL Server EXPRESS(というか、動的ポートを設定しているインスタンス)、サービスが停止していれば既定の>インスタンス(1433/tcpで動作していインスタンス)が表示されます。
この内容に近かったです。
SQL Browserが停止時は、既定のインスタンスのみ
SQL Browserが起動時は、既定のインスタンス、SQL EXPRESSの両方が取得できました。下記は結果です。
SQL Browserが停止の場合
ServerName InstanceName IsClustered Version
---------- ------------ ----------- -------
TEST-PCSQL Browserが起動の場合
ServerName InstanceName IsClustered Version
---------- ------------ ----------- -------
TEST-PC No 10.50.1600.1
TEST-PC SQLEXPRESS No 9.00.4035.00SQLBrowserサービスの状態にかかわらず、せめてローカルPC内のインスタンスは正確に取得してほしいのですが、方法はありますでしょうか。
-
SQLBrowserサービスの状態にかかわらず、せめてローカルPC内のインスタンスは正確に取得してほしいのですが、方法はありますでしょうか。
ローカルで、SQL Server 2005以降である場合、すごく負けた気がする(≒今後のバージョンでどうなるかわからない)けれども、以下を使ってます。
gsv | ? {$_.DisplayName -match '^SQL Server \('} | ? {$_.status -eq "running"} | Select-Object DisplayName
- 回答としてマーク OTAKA 2010年9月22日 5:26
-
一応、SQL Server 2005以降なら
HKEY_LOCAL_MACHINE\Software\Microsoft\Microsoft SQL Server\Instance Names\SQL
にインスタンス名が列挙されることになっています。SQL Server 200以前はそうではないようです。
-
一応、SQL Server 2005以降なら
HKEY_LOCAL_MACHINE\Software\Microsoft\Microsoft SQL Server\Instance Names\SQL
にインスタンス名が列挙されることになっています。SQL Server 200以前はそうではないようです。
のぞいてみたのですが、以下のようになっていました。
◎PowerShell 64bit版PS C:\> Get-ChildItem 'HKLM:\software\microsoft\microsoft sql server\instance Names' Hive: HKEY_LOCAL_MACHINE\software\microsoft\microsoft sql server\instance Names SKC VC Name Property --- -- ---- -------- 0 1 OLAP {MSSQLSERVER} 0 1 RS {MSSQLSERVER} 0 1 SQL {MSSQLSERVER}
◎PowerShell x86
PS C:\Users\Tadayoshi> Get-ChildItem 'HKLM:\software\microsoft\microsoft sql server\instance Names' Hive: HKEY_LOCAL_MACHINE\software\microsoft\microsoft sql server\instance Names SKC VC Name Property --- -- ---- -------- 0 1 SQL {SQLEXPRESS}
ちなみ、このマシンでは二つのインスタンスが稼働中です。
PS C:\> gsv | ? {$_.DisplayName -match '^SQL Server \('} | ? {$_.status -eq "running"} | Select-Object DisplayName DisplayName ----------- SQL Server (SQLEXPRESS) SQL Server (MSSQLSERVER)
カラクリは、お気づきの通り、既定のインスタンスは64bit版で、SQLEXPRESSは32bit版を導入しています。このようにCPUのエディションが違うと見え方が違うので、あまりこの方法は使っていません^^;
【ご参考】32ビット版が格納されるレジストリ
Windows Registry Editor Version 5.00 [HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Microsoft SQL Server\Instance Names\SQL] "SQLEXPRESS"="MSSQL.1"
-
Chuki さんのコマンドで取得しているのは、インスタンス名ではなく、厳密にはサービス名ではないでしょうか。
そこのところが「負けた気がする」なのかもしれませんけど…(笑)
SQL Server 2008 、もしくは SQL Server 2008 R2 の管理ツールがインストールされている
ならば、SQL Server プロバイダを使ってアクセスするというのも、1つの方法だと思います。
add-pssnapin "SQLServerProviderSnapin100"
get-childItem SQLSERVER:/SQL/Localhost | select-object InstanceName
- 編集済み ぱろむぽろむ 2010年9月23日 3:04 誤字
-
add-pssnapin "SQLServerProviderSnapin100"
get-childItem SQLSERVER:/SQL/Localhost | select-object InstanceName
確かに、一番最初に紹介すべきコマンド群ですね^^
ただ、なぜか微妙に変な動きします。なにがしかプロバイダで突っついてからでないと応答を返してこないことが多いんです><
あと、既定のインスタンスは、名前がないためなのか、真っ白です^^;PS C:\> add-pssnapin "SQLServerProviderSnapin100" PS C:\> get-childItem SQLSERVER:/SQL/Localhost | select-object InstanceName InstanceName ------------ PS C:\> PS C:\> cd SQLSERVER:\SQL\Localhost PS SQLSERVER:\SQL\Localhost> cd SQLSERVER:\SQL\Localhost\SQLEXPRESS PS SQLSERVER:\SQL\Localhost\SQLEXPRESS> cd c:\ PS C:\> get-childItem SQLSERVER:/SQL/Localhost | select-object InstanceName InstanceName ------------ SQLEXPRESS PS C:\>
ちなみに、SQLPS.EXEで実行すると、真っ白ではなく「DEFAULT」と表示されました^^
Microsoft SQL Server PowerShell バージョン 10.50.1600.1 Microsoft Corp. All rights reserved. PS SQLSERVER:\> Get-ChildItem SQL\Localhost Instance Name ------------- DEFAULT PS SQLSERVER:\> cd SQL\Localhost\SQLEXPRESS PS SQLSERVER:\SQL\Localhost\SQLEXPRESS> cd \ PS SQLSERVER:\> Get-ChildItem SQL\Localhost Instance Name ------------- DEFAULT SQLEXPRESS PS SQLSERVER:\>
おなじことを、Windows Server 2008/Server 2008 R2/7で実行してみましたが、同じ結果でした。
Server 2008/2008 R2はSymantec社、Windows 7はトレンドマイクロ社のセキュリティ製品を導入しています。
実行時には、念のためファイヤーウォールを停止させて実行しました。>Chuki さんのコマンドで取得しているのは、インスタンス名ではなく、厳密にはサービス名ではないでしょうか。
>そこのところが「負けた気がする」なのかもしれませんけど…(笑)すごく図星です。付け加えるなら、簡単に安定して結果を返してくれる方法をついに見つけることができなかったので、負けた気分が一層強くなっています><
#私の個人的な要件として、「稼働中のインスタンスを取得する」という命題があったもので……orz[System.Data.Sql.SqlDataSourceEnumerator]::Instance.GetDataSources()
このメソッドは、停止しているインスタンスも返してくるので問題外でした^^;【追伸】
DEFAULTと表示されるかどうかは、Select-Object InstanceName を入れるかどうかでした。DEFAULTとなっているプロパティはPSChildNameとDisplayNameだけでした。
MSSQLSERVERとなっているプロパティは、FilestreamShareName,ServiceNameでした。- 編集済み ChukiMVP 2010年9月23日 15:08 追伸を追加
-
Chuki さん、検証していただいて、ありがとうございます。
すごく手間がかかったでしょう…と労いたいところですが、楽しそうなので、
あえて封印させていただきます(笑)
既定のインスタンス名が表示されない件、正確を期すなら…
以下のChuki さんコマンド
gsv | ? {$_.DisplayName -match '^SQL Server \('} | ? {$_.status -eq "running"} | Select-Object DisplayName
※Select-Object の後は、DisplayName ではなく、ただの Name のほうが良くないですか?f^_^;
の結果と、sqlserver:/sql/localhost の下位階層にある ServiceName が一致するときの
InstanceName を取得するのが、一番いいのかなぁ…なんて気がします。
Chuki さんの検証と比べたら、茶々に近いかも…ですが(笑)