none
sqlインスタンスの列挙 RRS feed

  • 質問

  • お世話なります。

    同PCに、SQL2008R2とSQL2005の¥SQLEXPRESSをインストールしているのですが、

    「SQLEXPRESS」が

    [System.Data.Sql.SqlDataSourceEnumerator]::Instance.GetDataSources()

    で表示されません。

    教えてください。

    同PC上で上記のコマンドは実行しています。

     

    2010年9月21日 5:41

回答

  • SQL Browserサービスが停止していませんか?

     

    • 回答としてマーク OTAKA 2010年9月22日 5:26
    2010年9月21日 9:39
  • SQLBrowserサービスの状態にかかわらず、せめてローカルPC内のインスタンスは正確に取得してほしいのですが、方法はありますでしょうか。

    ローカルで、SQL Server 2005以降である場合、すごく負けた気がする(≒今後のバージョンでどうなるかわからない)けれども、以下を使ってます。

    gsv | ? {$_.DisplayName -match '^SQL Server \('} | ? {$_.status -eq "running"} | Select-Object DisplayName

    • 回答としてマーク OTAKA 2010年9月22日 5:26
    2010年9月22日 3:38

すべての返信

  • SQL Browserサービスが停止していませんか?

     

    • 回答としてマーク OTAKA 2010年9月22日 5:26
    2010年9月21日 9:39
  • あとは、Firewallで1434/UDPがブロックされていたりしませんか?

    SQL Server enumeration and Windows Firewall
    http://blogs.msdn.com/b/sql_protocols/archive/2005/09/24/473502.aspx

    • 編集済み ChukiMVP 2010年9月21日 9:56
    2010年9月21日 9:53
  • 今回とは関係ないと思いますが、この関数は非常に気持ち悪く、ローカルマシンの場合、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

    2010年9月21日 9:53
  • 旧バージョンからのアップグレードだったりとかいろいろな条件で、ローカルのインスタンスすら発見し損ねたような。

    ほんと信用ならないです。

    2010年9月21日 23:50
  • ご返事ありがとうございます。

    >今回とは関係ないと思いますが、この関数は非常に気持ち悪く、ローカルマシンの場合、SQL Browserサービスが動い>ていればSQL Server EXPRESS(というか、動的ポートを設定しているインスタンス)、サービスが停止していれば既定の>インスタンス(1433/tcpで動作していインスタンス)が表示されます。

    この内容に近かったです。

    SQL Browserが停止時は、既定のインスタンスのみ
    SQL Browserが起動時は、既定のインスタンス、SQL EXPRESSの両方が取得できました。

    下記は結果です。

    SQL Browserが停止の場合

    ServerName              InstanceName              IsClustered               Version
    ----------                    ------------                  -----------                   -------
    TEST-PC                                                   

    SQL Browserが起動の場合

    ServerName              InstanceName              IsClustered               Version
    ----------                    ------------                  -----------                   -------
    TEST-PC                                                      No                        10.50.1600.1
    TEST-PC                    SQLEXPRESS                   No                         9.00.4035.00

    SQLBrowserサービスの状態にかかわらず、せめてローカルPC内のインスタンスは正確に取得してほしいのですが、方法はありますでしょうか。

    2010年9月22日 1:44
  • SQLBrowserサービスの状態にかかわらず、せめてローカルPC内のインスタンスは正確に取得してほしいのですが、方法はありますでしょうか。

    ローカルで、SQL Server 2005以降である場合、すごく負けた気がする(≒今後のバージョンでどうなるかわからない)けれども、以下を使ってます。

    gsv | ? {$_.DisplayName -match '^SQL Server \('} | ? {$_.status -eq "running"} | Select-Object DisplayName

    • 回答としてマーク OTAKA 2010年9月22日 5:26
    2010年9月22日 3:38
  • ご返事ありがとうございます。

    教えていただいたコマンドで対応できそうなので、解決とさせていただきます。
    このような方法があるのは、なるほどとおもいました。

    しかし、インスタンス名が取得されることに越したことはないですが・・・

     

    2010年9月22日 5:26
  • 一応、SQL Server 2005以降なら

    HKEY_LOCAL_MACHINE\Software\Microsoft\Microsoft SQL Server\Instance Names\SQL

    にインスタンス名が列挙されることになっています。SQL Server 200以前はそうではないようです。

    SQL Server の既定のインスタンスおよび名前付きインスタンスのファイルの場所

    2010年9月22日 13:06
  • 一応、SQL Server 2005以降なら

    HKEY_LOCAL_MACHINE\Software\Microsoft\Microsoft SQL Server\Instance Names\SQL

    にインスタンス名が列挙されることになっています。SQL Server 200以前はそうではないようです。

    SQL Server の既定のインスタンスおよび名前付きインスタンスのファイルの場所


    のぞいてみたのですが、以下のようになっていました。


    ◎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"
    
    
    2010年9月22日 15:03
  • 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日 2:08
  • 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 追伸を追加
    2010年9月23日 14:51
  • Chuki さん、検証していただいて、ありがとうございます。

    すごく手間がかかったでしょう…と労いたいところですが、楽しそうなので、

    あえて封印させていただきます(笑)

     

    既定のインスタンス名が表示されない件、正確を期すなら…

    以下のChuki さんコマンド

    gsv | ? {$_.DisplayName -match '^SQL Server \('} | ? {$_.status -eq "running"} | Select-Object DisplayName

    ※Select-Object の後は、DisplayName ではなく、ただの Name のほうが良くないですか?f^_^;

     

    の結果と、sqlserver:/sql/localhost の下位階層にある ServiceName が一致するときの

    InstanceName を取得するのが、一番いいのかなぁ…なんて気がします。

     

    Chuki さんの検証と比べたら、茶々に近いかも…ですが(笑)

    2010年9月24日 11:59