So erhalten Sie den aktuellen Instanznamen von T-SQL

87

Wie kann ich mithilfe eines T-SQL-Skripts den SQL Server-Server und den Instanznamen der aktuellen Verbindung abrufen?

Guillermo Gutiérrez
quelle
Die akzeptierte Antwort ist richtig. SELECT @@SERVERNAMEerzeugt das Ergebnis, das für die Verbindung mit benötigt wird sqlcmd -S. Wenn es sich um die Standardinstanz MSSQLSERVER handelt, muss sie im Parameter -S nicht angegeben werden. Dies ist am 2017 14.0.2002.14 Developer Edition, 64-Bit.
beleuchtet

Antworten:

162

Ich habe gerade die Antwort in dieser SO-Frage gefunden (buchstäblich innerhalb der Frage, keine Antwort):

SELECT @@servername

Gibt Servername \ Instanz zurück, sofern dies nicht die Standardinstanz ist

SELECT @@servicename

Gibt den Instanznamen zurück, auch wenn dies der Standard ist (MSSQLSERVER).

Guillermo Gutiérrez
quelle
1
@blasto, das scheint das Verhalten zu sein, wenn die Instanz die Standardeinstellung auf dem Server ist. Versuchen Sie es mit einer benannten Instanz. Überprüfen Sie dies: technet.microsoft.com/en-us/library/ms187944.aspx
Guillermo Gutiérrez
10
Falsch, verwenden Sie @@ Servername kann Ihnen eine falsche Antwort geben. SELECT CONVERT (sysname, SERVERPROPERTY ('servername')) ist die richtige Antwort. Der @@ Servername gibt den SQL-Clusternamen an, während die Servereigenschaft ('Servername') den Windows-Clusternamen meldet. Sie benötigen den Windows-Clusternamen, um eine Verbindung zu Ihrer Datenbank herzustellen. (Der Windows-Clustername kann sich vom SQL-Clusternamen unterscheiden. Dies geschieht normalerweise, wenn Sie eine neue SQL Server-Version auf einem anderen Computer installieren (@@ servername = Environment.MachineName). und möchten den alten Namen behalten, damit Sie nicht alle Konfigurationen ändern müssen).
Stefan Steiger
1
@StefanSteiger Die akzeptierte Antwort der verknüpften SO-Frage gibt die von Ihnen vorgestellte Lösung an, aber die Kommentare zeigen an, dass sie bei einigen Personen nicht funktioniert.
Trisped
16

Wie wäre es damit:

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

Dadurch wird auch der Instanzname abgerufen. nullbedeutet Standardinstanz:

SELECT SERVERPROPERTY ('InstanceName')

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

Beno
quelle
10
SELECT SERVERPROPERTY ('InstanceName') gibt mir eine NULL.
Steam
4
Verwenden Sie stattdessen SELECT CONVERT (sysname, SERVERPROPERTY ('servername')).
Stefan Steiger
1
@Steam: Wahrscheinlich, weil es die Standardinstanz ist.
Stefan Steiger
10

SELECT @@servername gibt Ihnen Daten als server/instanceName

Um nur die zu erhalten instanceName, sollten Sie die select @@ServiceNameAbfrage ausführen .

Shirishkumar Bari
quelle
Erstens haben Sie den Schrägstrich falsch herum. Das richtige Formular ist "Server \ Instanz". Zweitens ist es nicht immer wahr, dass @@ Servername Ihnen sowohl den Server als auch die Instanz gibt, da nur eine einzige Instanz nur "Server" zurückgibt.
Robino
8

Ich habe das gefunden:

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

Dadurch erhalten Sie eine Liste aller auf Ihrem Server installierten Instanzen.


Die ServerNameEigenschaft der SERVERPROPERTYFunktion und @@SERVERNAMEgeben ähnliche Informationen zurück. Die ServerNameEigenschaft gibt den Windows-Server und den Instanznamen an, die zusammen die eindeutige Serverinstanz bilden. @@SERVERNAMEGibt den aktuell konfigurierten lokalen Servernamen an.

Ein Microsoft-Beispiel für den aktuellen Server lautet:

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

Dieses Szenario ist nützlich, wenn auf einem Windows-Server mehrere Instanzen von SQL Server installiert sind und der Client eine andere Verbindung zu derselben Instanz öffnen muss, die von der aktuellen Verbindung verwendet wird.

shA.t.
quelle
SELECT CONVERT (sysname, SERVERPROPERTY ('servername')); ist die richtige Antwort
Stefan Steiger
8

Warum nur beim Instanznamen anhalten? Sie können Ihre SQL Server-Umgebung folgendermaßen inventarisieren:

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
Nate S.
quelle
1
Good Stuff Nate, ich habe ein ähnliches erweitertes Inventarskript, das dasselbe tut. Kontaktieren Sie mich für eine Kopie per E-Mail ... Skript wäre für diesen Thread unscharf.
Hank Freeman
2

So rufen Sie die Liste der Server und Instanzen ab, mit denen Sie verbunden sind:

select * from Sys.Servers

So rufen Sie die Liste der Datenbanken ab, über die der verbundene Server verfügt:

SELECT * from sys.databases;
Saravanan Andavar
quelle
1

Nur um die Registrierungsabfragen etwas zu verdeutlichen. Sie listen nur die Instanzen der übereinstimmenden Bit (32 oder 64) für die aktuelle Instanz auf.

Der tatsächliche Registrierungsschlüssel für 32-Bit-SQL-Instanzen unter einem 64-Bit-Betriebssystem lautet:

HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Microsoft SQL Server

Sie können dies für eine 64-Bit-Instanz abfragen, um auch alle 32-Bit-Instanzen abzurufen. Die 32-Bit-Instanz scheint auf den Wow6432Node beschränkt zu sein und kann daher den 64-Bit-Registrierungsbaum nicht lesen.

Colin Campbell
quelle
0

Eine andere Methode, um den Instanznamen zu finden: Klicken Sie mit der rechten Maustaste auf den Datenbanknamen und wählen Sie Eigenschaften. In diesem Teil sehen Sie die Verbindungseigenschaften in der linken unteren Ecke. Klicken Sie darauf, um den Instanznamen anzuzeigen.

Yasin
quelle