インストールされているSQL Serverインスタンスとそのバージョンを確認するにはどうすればよいですか?


224

インストールしたSQLサーバー/ SQL Expressのインスタンスを(手動またはプログラムで)判別しようとしていますが、すべての例でSQLクエリを実行して、特定のインスタンスにすでに接続していると想定してこれを判別するように指示されています。 。


1
ここにリンクはsqlcmdので識別する方法であるmsdn.microsoft.com/en-us/library/ms165662%28v=sql.90%29.aspx

SQL Serverインスタンス(サーバー名)とバージョンを見つける方法 youtube.com/watch?v=DLrxFXXeLFk
mloskot

あなたが話しているSQLクエリを教えてください。
LearnByReading

1
@LearnByReading以下のMohammed Ifteqar Ahmedの回答を参照してください。
ルーク

2
:あなたは、レジストリ問い合わせることができますpmichaels.net/2016/02/12/...
ポール・マイケルズ

回答:


209

コマンドラインで:

SQLCMD -L

または

OSQL -L

(注:大文字のLである必要があります)

これにより、ネットワークにインストールされているすべてのSQLサーバーが一覧表示されます。SQL Serverがリストに表示されないように設定できる構成オプションがあります。これをする...

コマンドラインで:

svrnetcn

有効なプロトコルのリストで、[TCP / IP]を選択し、[プロパティ]をクリックします。「サーバーを隠す」のチェックボックスがあります。


2
コマンドラインオプションは好きですが、(ネットワークに接続されていない)開発者ボックスで試したところ、結果がまちまちになりました。基本的に「sqlcmd -L」は、SQL Server Browserサービスが実行されている場合にのみ機能しました。それは予想されることですか?
Matt

シンプルでストレートなときに大好きです。Amazon Web Service SQL Serverインスタンスに入力する適切なサーバー名を見つけるのに苦労していました。ThanX
Mehdi LAMRANI、

1
素敵なコマンドですが、何らかの理由で、ネットワーク上でSQLExpressインスタンスが検出されましたが、ローカルマシン上でSQLExpressインスタンスを検出できませんでした。
15

1
@sparebytes:理由はここにあります:dba.stackexchange.com/questions/18499/…– DonBecker 16
1

試してみてくださいC:\> sqllocaldb i
Contango

82

このレジストリ値をクエリして、SQLバージョンを直接取得できます。

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\90\Tools\ClientSetup\CurrentVersion

または、インスタンス名をクエリしてから、sqlcmdを使用したいインスタンス名で使用することもできます。

インスタンス名を確認するには:

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\Instance Names

次にこれを実行します:

SELECT SERVERPROPERTY('productversion'), SERVERPROPERTY ('productlevel'), SERVERPROPERTY ('edition')

C ++を使用している場合は、このコードを使用してレジストリ情報を取得できます。


(「PRODUCTVERSION」)、SERVERPROPERTY(「productlevel」)、SERVERPROPERTY(「版」)のみを示し、サーバ、一つだけではなく、インスタンスを実行するか、インストールされているが、サーバを停止
ゲンナジーバニンГеннадийВанин

おかげで、クエリはうまくいきました。私はマシンを持っていて、2008と2008 R2のデフォルトインスタンスとSQL Expressインスタンスを知りたいと思っていました。各インスタンスに接続してクエリを実行し、バージョン番号を取得しました。数字をググるのは簡単でした。
Meligy、

3
"HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Microsoft SQL Server \ <version> \ Tools \ ClientSetup \ CurrentVersion"と "HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Microsoft SQL Server \ Instance Names"が32ビット部分に表示されるようです。インスタンスへの実際のパス「HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Microsoft SQL Server \ <instancename>」が64ビットハイブに表示されます。
NGaida 2013年

レジストリは、インストールされたソフトウェアのソース定義です。このソリューションでは、最終的にレジストリ値を使用するCLIツールや、レジストリも使用するMMCスナップインを使用するのではなく、直接ソースにアクセスできます。完璧
バリーピッカー2017年

76

インストールされたすべてのインスタンスが、Microsoft管理コンソールのサービススナップインに表示されます。インスタンス名を取得するには、スタート|に移動します。実行| Services.mscと入力し、「Sql Server(Instance Name)」のすべてのエントリを探します。


13
同等のPowerShellコマンド:Get-Service | ?{ $_.Name -like "MSSQL*" }
orad

2
私のコンピュータは、MSSQL $ SQLEXPRESSが表示名SQL Server(SQLEXPRESS)で実行されていることを示していますが、これをサーバー名に入力するにはどうすればよいですか?テスト接続で次のようなエラーが表示される... SQLサーバーに接続しようとしたときに、ネットワーク関連またはインスタンス固有のエラーが発生しました
webzy

47

-マシンにインストールされているインスタンスのリストを検索するT-SQLクエリ

DECLARE @GetInstances TABLE
( Value nvarchar(100),
 InstanceNames nvarchar(100),
 Data nvarchar(100))

Insert into @GetInstances
EXECUTE xp_regread
  @rootkey = 'HKEY_LOCAL_MACHINE',
  @key = 'SOFTWARE\Microsoft\Microsoft SQL Server',
  @value_name = 'InstalledInstances'

Select InstanceNames from @GetInstances 

いいね!そのまま接続が必要だと思いsaませんか?
jyz

3
+1インスタンスに関する情報のソースは、ブライアンの回答と同じです。Windowsレジストリから値を取得するために、誰かがC#コードを書くこともできます。答えは今のところ冗長であると思いましたが、xp_regreadについて知っておくといいでしょう。#ありがとう。
Mzn 2014年

クエリ結果はインスタンス名のみです。各インスタンスの互換性レベルを結果に追加できますか?
Marwan Almukh 2017年

16

このスレッドは少し古いことを知っていますが、探していた答えを見つけて共有したいと思う前にこのスレッドに出くわしました。SQLExpress(またはlocaldb)を使用している場合、インスタンス名を見つける簡単な方法があります。コマンドラインで次のように入力します。

> sqllocaldb i

ローカルにインストールしたインスタンス名が一覧表示されます。そのため、接続するインスタンス名の前に完全なサーバー名の(localdb)\を含める必要があります。また、sqllocaldbを使用すると、新しいインスタンスを作成または削除したり、構成したりできます。参照:SqlLocalDBユーティリティ


11

現在ログインしているマシンに何がインストールされているかを確認したいだけの場合、最も簡単な手動プロセスは、(スタートメニューから)SQL Server構成マネージャーを開くだけで、すべてのSQLサービス(およびSQLサービスのみ)そのハードウェア(実行中かどうかにかかわらず)。これは、SQL Server 2005以降を想定しています。dotnetengineerがサービス管理コンソールを使用することを推奨すると、すべてのサービスが表示され、常に利用できるはずです(たとえば、SQL Serverの以前のバージョンを実行している場合)。

ただし、より広範な検出プロセスを探している場合は、SQLReconやSQLPingなどのサードパーティツールを検討してください。これらのツールは、ネットワークをスキャンし、アクセスできるサーバー上で見つかったすべてのSQLサービスインスタンスのレポートを作成します。このようなツールを使用して久しぶりですが、ツールの発見に驚きました(つまり、私が知らなかった少数のインスタンスが存在した)。YMMV。詳細についてはグーグルかもしれませんが、このページには関連するダウンロードがあると思います:http : //www.sqlsecurity.com/Tools/FreeTools/tabid/65/Default.aspx


1
SQL Server構成マネージャーはまさに私が必要としていたものでした。早くて簡単。
Chris

8

SQL Serverにより、アプリケーションは現在のネットワーク内でSQL Serverインスタンスを見つけることができます。SqlDataSourceEnumeratorクラスは、この情報をアプリケーション開発者に公開し、すべての可視サーバーに関する情報を含むDataTableを提供します。この返されるテーブルには、ユーザーが新しい接続を作成しようとしたときに提供されるリストと一致する、ネットワーク上で使用可能なサーバーインスタンスのリストが含まれ、[接続のプロパティ]ダイアログボックスで使用可能なすべてのサーバーを含むドロップダウンリストが展開されます。表示される結果は必ずしも完全ではありません。使用可能なSQL Serverインスタンスに関する情報を含むテーブルを取得するには、最初に共有/静的インスタンスプロパティを使用して列挙子を取得する必要があります。

using System.Data.Sql;

class Program
{
  static void Main()
  {
    // Retrieve the enumerator instance and then the data.
    SqlDataSourceEnumerator instance =
      SqlDataSourceEnumerator.Instance;
    System.Data.DataTable table = instance.GetDataSources();

    // Display the contents of the table.
    DisplayData(table);

    Console.WriteLine("Press any key to continue.");
    Console.ReadKey();
  }

  private static void DisplayData(System.Data.DataTable table)
  {
    foreach (System.Data.DataRow row in table.Rows)
    {
      foreach (System.Data.DataColumn col in table.Columns)
      {
        Console.WriteLine("{0} = {1}", col.ColumnName, row[col]);
      }
      Console.WriteLine("============================");
    }
  }
}

msdn http://msdn.microsoft.com/en-us/library/a6t1z9x2(v=vs.80).aspxから


このサブネットまたはドメインのサブネットを指定する必要がありますか?それは私のためにnullに戻ります。更新してください
トランスフォーマー

1
.NET Coreの使用を検討している場合SqlDataSourceEnumeratorは、まだ実装されていませんが、GitHubの問題に応じて追加されるリストに含まれています
Daniel Hill


5

スクリプトでこれを決定することに興味がある場合は、以下を試すことができます。

sc \\server_name query | grep MSSQL

注:grepはgnuwin32ツールの一部です


3
findstr代わりに使用できますgrep
Pablo Montilla、2014年

FINDを使用して、sc \\ server_nameクエリを実行
Julio Nobre

5

Windowsコマンドラインから、次のように入力します。

SC \\server_name query | find /I "SQL Server ("

ここで、「server_name」は、SQLインスタンスを表示するリモートサーバーの名前です。

もちろん、これには十分な権限が必要です。


2008 R2と複数のExpressおよびLocalDBインスタンスが実行されている私の開発マシンでは動作しません。
クリストフ

4

このクエリにより、サーバー名とインスタンス名が取得されます。

SELECT @@SERVERNAME, @@SERVICENAME

3
これは、実行中のクエリに関連付けられている現在のインスタンスの名前を通知するだけです。OPは、インストールされているすべてのインスタンスのリストを要求した
Jay Walker

1
これは、インストールされているSQLサーバーのバージョンに関する情報を提供しません
Ahmad

2

同じ問題がありました。「osql -L」コマンドはサーバーのリストのみを表示しましたが、インスタンス名は表示しませんでした(私のローカルSQLサーバーのインスタンスのみが表示されました)。Wiresharkでは、sqlbrowser.exe(SQLインストールの共有フォルダーにあります)で問題の解決策を見つけました。

ローカルインスタンスは、レジストリエントリによって解決されます。リモートインスタンスは、UDPブロードキャスト(ポート1434)およびSMBによって解決されます。「sqlbrowser.exe -c」を使用してリクエストを一覧表示します。

私の構成では、1つの物理ネットワークアダプターと3つの仮想ネットワークアダプターを使用しています。「osql -L」コマンドを使用した場合、sqlbrowserは、物理アダプターではなく、仮想アダプターの1つ(別のネットワークセグメントにある)からの要求を表示しました。osqlは、メトリックによってアダプターを選択します。コマンド「route print」でメトリックを確認できます。私の構成では、ルーティングテーブルは、物理アダプターよりも仮想アダプターの方が低いメトリックを示しました。そこで、詳細なネットワーク設定で自動メトリックを選択解除して、ネットワークプロパティのインターフェースメトリックを変更しました。osqlが物理アダプターを使用するようになりました。


2

もう1つのオプションは、SQLSERVER検出レポートを実行することです。sqlserverのインストールメディアに移動し、setup.exeをダブルクリックします。

ここに画像の説明を入力してください

次の画面で、ツールに移動し、以下に示すように検出レポートをクリックします

ここに画像の説明を入力してください

これにより、存在するすべてのインスタンスが機能全体とともに表示されます。以下は、私のPC上のスナップショットです。 ここに画像の説明を入力してください


1

SQL Server 2008をインストールしましたが、データベースインスタンスに接続できませんでした。@G Mastrosが投稿したコマンドは、アクティブなインスタンスをリストしていません。

サービスを調べたところ、SQLサーバーエージェントが無効になっていることがわかりました。自動に設定してから起動して修正しました。


1

100台以上のサーバーを評価しているときにも同じ問題が発生しました。SQLで構成されるサービス名を参照するC#で記述されたスクリプトがありました。インスタンスがサーバーにインストールされると、SQL Serverは各インスタンスのサービスをサービス名で追加します。2000から2008のようにバージョンによって異なる場合がありますが、確かにインスタンス名を持つサービスがあります。

サービス名を取得し、サービス名からインスタンス名を取得します。以下は、WMIクエリ結果で使用されるサンプルコードです。

if (ServiceData.DisplayName == "MSSQLSERVER" || ServiceData.DisplayName == "SQL Server (MSSQLSERVER)")
            {
                InstanceData.Name = "DEFAULT";
                InstanceData.ConnectionName = CurrentMachine.Name;
                CurrentMachine.ListOfInstances.Add(InstanceData);
            }
            else
                if (ServiceData.DisplayName.Contains("SQL Server (") == true)
                {
                    InstanceData.Name = ServiceData.DisplayName.Substring(
                                            ServiceData.DisplayName.IndexOf("(") + 1,
                                            ServiceData.DisplayName.IndexOf(")") - ServiceData.DisplayName.IndexOf("(") - 1
                                        );
                    InstanceData.ConnectionName = CurrentMachine.Name + "\\" + InstanceData.Name;
                    CurrentMachine.ListOfInstances.Add(InstanceData);
                }
                else
                    if (ServiceData.DisplayName.Contains("MSSQL$") == true)
                    {
                        InstanceData.Name = ServiceData.DisplayName.Substring(
                                                ServiceData.DisplayName.IndexOf("$") + 1,
                                                ServiceData.DisplayName.Length - ServiceData.DisplayName.IndexOf("$") - 1
                                            );

                        InstanceData.ConnectionName = CurrentMachine.Name + "\\" + InstanceData.Name;
                        CurrentMachine.ListOfInstances.Add(InstanceData);
                    }

0

簡単な方法は次のとおりです。[スタート]、[プログラム]、[Microsoft SQL Server 2005]、[構成ツール]、[SQL Server構成マネージャー]、[SQL Server 2005ネットワーク構成]の順に選択して、マシンにインストールされているすべてのインスタンスを見つけます。


0

私はその古い投稿を知っていますが、バージョンを含むローカルまたはリモートマシンにインストールされているSQLインスタンスを見つけ、他のプロパティを取得して拡張できる、PoweShellによる素晴らしいソリューションを見つけました。

$MachineName = ‘.’ # Default local computer Replace . with server name for a remote computer

$reg = [Microsoft.Win32.RegistryKey]::OpenRemoteBaseKey(‘LocalMachine’, $MachineName)
$regKey= $reg.OpenSubKey("SOFTWARE\\Microsoft\\Microsoft SQL Server\\Instance Names\\SQL" )
$values = $regkey.GetValueNames()
$values | ForEach-Object {$value = $_ ; $inst = $regKey.GetValue($value); 
              $path = "SOFTWARE\\Microsoft\\Microsoft SQL Server\\"+$inst+"\\MSSQLServer\\"+"CurrentVersion";
              #write-host $path; 
              $version = $reg.OpenSubKey($path).GetValue("CurrentVersion");
                          write-host "Instance" $value;
              write-host  "Version" $version}

こんにちはこれは素晴らしい方法です。これをC#クラスの中にラップしたり、コードからこれを呼び出す方法はありますか
トランスフォーマー

こんにちは。これはpowershellでの最初の試みなので、ご協力いただければ幸いです。このスクリプトを実行しようとすると、次のエラーが表示されます。AldoはすべてのリモートSQLサーバーを検出しますか?SQL Serverとそのデータベースのリストをコンパイルしようとしています。null値の式でメソッドを呼び出すことはできません。+ $ values = $ regkey.GetValueNames()
Darryl Wilson

0

コマンドOSQL -LSQLCMD -L、ネットワーク上のすべてのインスタンスを表示します。

サーバー上のすべてのインスタンスのリストが必要で、スクリプトやプログラミングをしたくない場合は、次のようにします。

  1. Windowsタスクマネージャを起動します。
  2. 「すべてのユーザーからのプロセスを表示する」チェックボックスまたは同等のものを選択します
  3. プロセスを「イメージ名」でソートします
  4. すべてのsqlsrvr.exe画像を見つける

インスタンスは「ユーザー名」列にとしてリストされているはずMSSQL$INSTANCE_NAMEです。

そして、私は貧弱なサーバーが63のインスタンスを実行していたことから、それが3つのインスタンスを実行していることに気づきました(そのうちの1つは、CPU負荷によるいじめっ子のように振る舞っていました...)


0

SQLサーバーregクエリのインスタンスを取得します "HKLM \ Software \ Microsoft \ Microsoft SQL Server \ Instance Names \ SQL"

またはSQLCMD -Lを使用します


-1

SSMS内で使用する方が簡単な場合があります。

SELECT @@Version

3
質問自体は、SQLクエリを使用してバージョンを特定することを望まない、またはできないことを示しています
Trotski94
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.