T-SQLスクリプトを使用して、SQL Serverサーバーと現在の接続のインスタンス名を取得するにはどうすればよいですか?
回答:
このSOの質問で答えを見つけました(文字通り、質問の中にあり、答えはありません):
SELECT @@servername
これがデフォルトのインスタンスでない限り、servername \ instanceを返します
SELECT @@servicename
これがデフォルトであっても、インスタンス名を返します(MSSQLSERVER)
これはどう:
EXECUTE xp_regread @rootkey='HKEY_LOCAL_MACHINE',
@key='SOFTWARE\Microsoft\Microsoft SQL Server\Instance Names\SQl',
@value_name='MSSQLSERVER'
これにより、インスタンス名も取得されます。null
デフォルトインスタンスを意味します:
SELECT SERVERPROPERTY ('InstanceName')
SELECT @@servername
次のようにデータを提供します server/instanceName
のみを取得するには、クエリinstanceName
を実行する必要がありselect @@ServiceName
ます。
私はこれを見つけました:
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のインスタンスが複数インストールされており、クライアントが現在の接続で使用されているのと同じインスタンスへの別の接続を開く必要がある場合に役立ちます。
なぜインスタンス名だけで停止するのですか?次の方法で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
接続しているサーバーとインスタンスのリストを取得するには:
select * from Sys.Servers
接続されたサーバーが持っているデータベースのリストを取得するには:
SELECT * from sys.databases;
レジストリクエリにいくつかの説明を追加するだけです。それらは、現在のインスタンスに一致するビット数(32または64)のインスタンスのみをリストします。
64ビットOS上の32ビットSQLインスタンスの実際のレジストリキーは次のとおりです。
HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Microsoft SQL Server
これを64ビットインスタンスでクエリして、すべての32ビットインスタンスを取得することもできます。32ビットインスタンスはWow6432Nodeに制限されているようであるため、64ビットレジストリツリーを読み取ることができません。
SELECT @@SERVERNAME
を使用して接続するために必要な結果を生成しsqlcmd -S
ます。これがデフォルトのMSSQLSERVERインスタンスである場合は、-Sパラメータで指定しないでください。これは201714.0.2002.14 Developer Edition、64ビットです。