T-SQLから現在のインスタンス名を取得する方法


90

T-SQLスクリプトを使用して、SQL Serverサーバーと現在の接続のインスタンス名を取得するにはどうすればよいですか?


受け入れられた答えは正しいです。SELECT @@SERVERNAMEを使用して接続するために必要な結果を生成しsqlcmd -Sます。これがデフォルトのMSSQLSERVERインスタンスである場合は、-Sパラメータで指定しないでください。これは201714.0.2002.14 Developer Edition、64ビットです。
点灯

回答:


165

このSOの質問で答えを見つけました(文字通り、質問の中にあり、答えはありません):

SELECT @@servername

これがデフォルトのインスタンスでない限り、servername \ instanceを返します

SELECT @@servicename

これがデフォルトであっても、インスタンス名を返します(MSSQLSERVER)


1
@blasto、これは、インスタンスがサーバーのデフォルトである場合の動作のようです。名前付きインスタンスで試してください。:このチェックtechnet.microsoft.com/en-us/library/ms187944.aspx
ギジェルモ・グティエレス

10
不正解です。@@ servernameを使用すると、間違った答えが返される可能性があります。SELECT CONVERT(sysname、SERVERPROPERTY( 'servername'))が正解です。@@ ServerNameはSQLクラスター名を報告し、serverproperty( 'servername')はWindowsクラスター名を報告します。データベースに接続するには、Windowsクラスター名が必要です(Windowsクラスター名はSQLクラスター名とは異なる場合があります。これは通常、新しいsql-serverバージョンを別のマシン(@@ servername = Environment.MachineName)にインストールするときに発生します。すべての構成を変更する必要がないように、古い名前を保持したい)。
Stefan Steiger 2015

1
@StefanSteigerリンクされたSO質問の受け入れられた回答は、提示した解決策を示していますが、コメントは、一部の人にとっては機能しないことを示しています。
2016年

17

これはどう:

EXECUTE xp_regread @rootkey='HKEY_LOCAL_MACHINE',
                   @key='SOFTWARE\Microsoft\Microsoft SQL Server\Instance Names\SQl',
                   @value_name='MSSQLSERVER'

これにより、インスタンス名も取得されます。nullデフォルトインスタンスを意味します:

SELECT SERVERPROPERTY ('InstanceName')

http://technet.microsoft.com/en-us/library/ms174396.aspx


10
SELECT SERVERPROPERTY( 'InstanceName')はNULLを返します。
Steam

4
代わりに、SELECT CONVERT(sysname、SERVERPROPERTY( 'servername'));を使用してください。
Stefan Steiger 2015

1
@Steam:おそらくそれがdefault-instanceだからです。
Stefan Steiger

10

SELECT @@servername 次のようにデータを提供します server/instanceName

のみを取得するには、クエリinstanceNameを実行する必要がありselect @@ServiceNameます。


まず、スラッシュの方法が間違っています。正しい形式は「server \ instance」です。次に、@@ servernameがサーバーとインスタンスの両方を提供するということは必ずしも真実ではありません。インスタンスが1つしかない場合は、「サーバー」だけが返されるためです。
Robino 2017年

8

私はこれを見つけました:

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

これにより、サーバーにインストールされているすべてのインスタンスのリストが表示されます。


関数のServerNameプロパティSERVERPROPERTY@@SERVERNAME同様の情報を返します。このServerNameプロパティは、一意のサーバーインスタンスを構成するWindowsサーバーとインスタンス名を提供します。@@SERVERNAME現在構成されているローカルサーバー名を提供します。

現在のサーバーのMicrosoftの例は次のとおりです。

SELECT CONVERT(sysname, SERVERPROPERTY('servername'));

このシナリオは、WindowsサーバーにSQL Serverのインスタンスが複数インストールされており、クライアントが現在の接続で使用されているのと同じインスタンスへの別の接続を開く必要がある場合に役立ちます。


SELECT CONVERT(sysname、SERVERPROPERTY( 'servername')); 正解です
Stefan Steiger 2015

8

なぜインスタンス名だけで停止するのですか?次の方法でSQLServer環境のインベントリを作成できます。

SELECT  
    SERVERPROPERTY('ServerName') AS ServerName,  
    SERVERPROPERTY('MachineName') AS MachineName,
    CASE 
        WHEN  SERVERPROPERTY('InstanceName') IS NULL THEN ''
        ELSE SERVERPROPERTY('InstanceName')
    END AS InstanceName,
    '' as Port, --need to update to strip from Servername. Note: Assumes Registered Server is named with Port
    SUBSTRING ( (SELECT @@VERSION),1, CHARINDEX('-',(SELECT @@VERSION))-1 ) as ProductName,
    SERVERPROPERTY('ProductVersion') AS ProductVersion,  
    SERVERPROPERTY('ProductLevel') AS ProductLevel,
    SERVERPROPERTY('ProductMajorVersion') AS ProductMajorVersion,
    SERVERPROPERTY('ProductMinorVersion') AS ProductMinorVersion,
    SERVERPROPERTY('ProductBuild') AS ProductBuild,
    SERVERPROPERTY('Edition') AS Edition,
    CASE SERVERPROPERTY('EngineEdition')
        WHEN 1 THEN 'PERSONAL'
        WHEN 2 THEN 'STANDARD'
        WHEN 3 THEN 'ENTERPRISE'
        WHEN 4 THEN 'EXPRESS'
        WHEN 5 THEN 'SQL DATABASE'
        WHEN 6 THEN 'SQL DATAWAREHOUSE'
    END AS EngineEdition,  
    CASE SERVERPROPERTY('IsHadrEnabled')
        WHEN 0 THEN 'The Always On Availability Groups feature is disabled'
        WHEN 1 THEN 'The Always On Availability Groups feature is enabled'
        ELSE 'Not applicable'
    END AS HadrEnabled,
    CASE SERVERPROPERTY('HadrManagerStatus')
        WHEN 0 THEN 'Not started, pending communication'
        WHEN 1 THEN 'Started and running'
        WHEN 2 THEN 'Not started and failed'
        ELSE 'Not applicable'
    END AS HadrManagerStatus,
    CASE SERVERPROPERTY('IsSingleUser') WHEN 0 THEN 'No' ELSE 'Yes' END AS InSingleUserMode,
    CASE SERVERPROPERTY('IsClustered')
        WHEN 1 THEN 'Clustered'
        WHEN 0 THEN 'Not Clustered'
        ELSE 'Not applicable'
    END AS IsClustered,
    '' as ServerEnvironment,
    '' as ServerStatus,
    '' as Comments

1
Good Stuff Nate、私は同じことをする同様のより強化されたインベントリスクリプトを持っています。電子メールでのコピーについては私に連絡してください...スクリプトはこのスレッドでは焦点が合っていません。
ハンクフリーマン

2

接続しているサーバーとインスタンスのリストを取得するには:

select * from Sys.Servers

接続されたサーバーが持っているデータベースのリストを取得するには:

SELECT * from sys.databases;

1

レジストリクエリにいくつかの説明を追加するだけです。それらは、現在のインスタンスに一致するビット数(32または64)のインスタンスのみをリストします。

64ビットOS上の32ビットSQLインスタンスの実際のレジストリキーは次のとおりです。

HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Microsoft SQL Server

これを64ビットインスタンスでクエリして、すべての32ビットインスタンスを取得することもできます。32ビットインスタンスはWow6432Nodeに制限されているようであるため、64ビットレジストリツリーを読み取ることができません。


0

インスタンス名を見つける別の方法-データベース名を右クリックして[プロパティ]を選択します。この部分では、左下隅に接続プロパティの表示が表示されます。クリックすると、インスタンス名が表示されます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.