インストールしたSQLサーバー/ SQL Expressのインスタンスを(手動またはプログラムで)判別しようとしていますが、すべての例でSQLクエリを実行して、特定のインスタンスにすでに接続していると想定してこれを判別するように指示されています。 。
インストールしたSQLサーバー/ SQL Expressのインスタンスを(手動またはプログラムで)判別しようとしていますが、すべての例でSQLクエリを実行して、特定のインスタンスにすでに接続していると想定してこれを判別するように指示されています。 。
回答:
コマンドラインで:
SQLCMD -L
または
OSQL -L
(注:大文字のLである必要があります)
これにより、ネットワークにインストールされているすべてのSQLサーバーが一覧表示されます。SQL Serverがリストに表示されないように設定できる構成オプションがあります。これをする...
コマンドラインで:
svrnetcn
有効なプロトコルのリストで、[TCP / IP]を選択し、[プロパティ]をクリックします。「サーバーを隠す」のチェックボックスがあります。
C:\> sqllocaldb i
このレジストリ値をクエリして、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')
インストールされたすべてのインスタンスが、Microsoft管理コンソールのサービススナップインに表示されます。インスタンス名を取得するには、スタート|に移動します。実行| Services.mscと入力し、「Sql Server(Instance Name)」のすべてのエントリを探します。
Get-Service | ?{ $_.Name -like "MSSQL*" }
-マシンにインストールされているインスタンスのリストを検索する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
ませんか?
このスレッドは少し古いことを知っていますが、探していた答えを見つけて共有したいと思う前にこのスレッドに出くわしました。SQLExpress(またはlocaldb)を使用している場合、インスタンス名を見つける簡単な方法があります。コマンドラインで次のように入力します。
> sqllocaldb i
ローカルにインストールしたインスタンス名が一覧表示されます。そのため、接続するインスタンス名の前に完全なサーバー名の(localdb)\を含める必要があります。また、sqllocaldbを使用すると、新しいインスタンスを作成または削除したり、構成したりできます。参照:SqlLocalDBユーティリティ。
現在ログインしているマシンに何がインストールされているかを確認したいだけの場合、最も簡単な手動プロセスは、(スタートメニューから)SQL Server構成マネージャーを開くだけで、すべてのSQLサービス(およびSQLサービスのみ)そのハードウェア(実行中かどうかにかかわらず)。これは、SQL Server 2005以降を想定しています。dotnetengineerがサービス管理コンソールを使用することを推奨すると、すべてのサービスが表示され、常に利用できるはずです(たとえば、SQL Serverの以前のバージョンを実行している場合)。
ただし、より広範な検出プロセスを探している場合は、SQLReconやSQLPingなどのサードパーティツールを検討してください。これらのツールは、ネットワークをスキャンし、アクセスできるサーバー上で見つかったすべてのSQLサービスインスタンスのレポートを作成します。このようなツールを使用して久しぶりですが、ツールの発見に驚きました(つまり、私が知らなかった少数のインスタンスが存在した)。YMMV。詳細についてはグーグルかもしれませんが、このページには関連するダウンロードがあると思います:http : //www.sqlsecurity.com/Tools/FreeTools/tabid/65/Default.aspx
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から
SQL Server Browserサービスhttp://msdn.microsoft.com/en-us/library/ms181087.aspx
スクリプトでこれを決定することに興味がある場合は、以下を試すことができます。
sc \\server_name query | grep MSSQL
注:grepはgnuwin32ツールの一部です
findstr
代わりに使用できますgrep
。
このクエリにより、サーバー名とインスタンス名が取得されます。
SELECT @@SERVERNAME, @@SERVICENAME
同じ問題がありました。「osql -L」コマンドはサーバーのリストのみを表示しましたが、インスタンス名は表示しませんでした(私のローカルSQLサーバーのインスタンスのみが表示されました)。Wiresharkでは、sqlbrowser.exe(SQLインストールの共有フォルダーにあります)で問題の解決策を見つけました。
ローカルインスタンスは、レジストリエントリによって解決されます。リモートインスタンスは、UDPブロードキャスト(ポート1434)およびSMBによって解決されます。「sqlbrowser.exe -c」を使用してリクエストを一覧表示します。
私の構成では、1つの物理ネットワークアダプターと3つの仮想ネットワークアダプターを使用しています。「osql -L」コマンドを使用した場合、sqlbrowserは、物理アダプターではなく、仮想アダプターの1つ(別のネットワークセグメントにある)からの要求を表示しました。osqlは、メトリックによってアダプターを選択します。コマンド「route print」でメトリックを確認できます。私の構成では、ルーティングテーブルは、物理アダプターよりも仮想アダプターの方が低いメトリックを示しました。そこで、詳細なネットワーク設定で自動メトリックを選択解除して、ネットワークプロパティのインターフェースメトリックを変更しました。osqlが物理アダプターを使用するようになりました。
もう1つのオプションは、SQLSERVER検出レポートを実行することです。sqlserverのインストールメディアに移動し、setup.exeをダブルクリックします。
次の画面で、ツールに移動し、以下に示すように検出レポートをクリックします
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);
}
私はその古い投稿を知っていますが、バージョンを含むローカルまたはリモートマシンにインストールされている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}
コマンドOSQL -L
とSQLCMD -L
は、ネットワーク上のすべてのインスタンスを表示します。
サーバー上のすべてのインスタンスのリストが必要で、スクリプトやプログラミングをしたくない場合は、次のようにします。
sqlsrvr.exe
画像を見つけるインスタンスは「ユーザー名」列にとしてリストされているはずMSSQL$INSTANCE_NAME
です。
そして、私は貧弱なサーバーが63のインスタンスを実行していたことから、それが3つのインスタンスを実行していることに気づきました(そのうちの1つは、CPU負荷によるいじめっ子のように振る舞っていました...)