Cara mendapatkan nama instance saat ini dari T-SQL

90

Bagaimana cara mendapatkan server SQL Server dan nama instance dari koneksi saat ini, menggunakan skrip T-SQL?

Guillermo Gutiérrez
sumber
Jawaban yang diterima benar. SELECT @@SERVERNAMEmenghasilkan hasil yang dibutuhkan untuk terhubung menggunakan sqlcmd -S. Jika itu adalah contoh MSSQLSERVER default, maka itu harus -tidak- ditentukan dalam parameter -S. Ini ada pada edisi 2017 14.0.2002.14 Pengembang, 64-bit.
menyalakan

Jawaban:

166

Baru saja menemukan jawabannya, dalam pertanyaan SO ini (secara harfiah, di dalam pertanyaan, bukan jawaban apa pun):

SELECT @@servername

mengembalikan nama server \ instance sejauh ini bukan instance default

SELECT @@servicename

mengembalikan nama contoh, meskipun ini adalah default (MSSQLSERVER)

Guillermo Gutiérrez
sumber
1
@blasto, yang tampaknya menjadi perilaku saat instance adalah default di server. Coba dengan contoh bernama. Periksa ini: technet.microsoft.com/en-us/library/ms187944.aspx
Guillermo Gutiérrez
10
Salah, gunakan @@ namaserver dapat memberikan jawaban yang salah. SELECT CONVERT (sysname, SERVERPROPERTY ('servername')) adalah jawaban yang benar. @@ ServerName melaporkan nama cluster SQL, sedangkan properti server ('namaserver') melaporkan nama cluster Windows. Anda memerlukan nama cluster Windows untuk menyambung ke db Anda (Nama cluster Windows dapat berbeda dari nama cluster SQL; Ini biasanya terjadi ketika Anda menginstal versi sql-server baru di mesin yang berbeda (@@ servername = Environment.MachineName) dan ingin mempertahankan nama lama sehingga Anda tidak perlu mengubah semua konfigurasi).
Stefan Steiger
1
@StefanSteiger Jawaban yang diterima dari pertanyaan SO terkait menunjukkan solusi yang Anda berikan, tetapi komentar menunjukkan bahwa itu tidak berhasil untuk sebagian orang.
Dicabut
17

Bagaimana dengan ini:

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

Ini akan mendapatkan nama instance juga. nullberarti contoh default:

SELECT SERVERPROPERTY ('InstanceName')

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

Beno
sumber
10
SELECT SERVERPROPERTY ('InstanceName') memberi saya NULL.
Steam
4
sebagai gantinya gunakan SELECT CONVERT (sysname, SERVERPROPERTY ('servername'));
Stefan Steiger
1
@Steam: Mungkin karena ini adalah instance default.
Stefan Steiger
10

SELECT @@servername akan memberi Anda data sebagai server/instanceName

Untuk mendapatkan hanya instanceNameAnda yang harus menjalankan select @@ServiceNamekueri.

Shirishkumar Bari
sumber
Pertama, Anda salah menebas. Bentuk yang benar adalah "server \ instance". Kedua, tidak selalu benar bahwa @@ namaserver akan memberi Anda server DAN instance karena jika hanya ada satu instance, ia hanya akan mengembalikan "server".
Robino
8

Aku menemukan ini:

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

Itu akan memberi Anda daftar semua contoh yang dipasang di server Anda.


The ServerNamemilik SERVERPROPERTYfungsi dan @@SERVERNAMEkembali informasi yang sama. The ServerNameproperti menyediakan Windows server dan contoh nama yang bersama-sama membentuk contoh server yang unik. @@SERVERNAMEmenyediakan nama server lokal yang saat ini dikonfigurasi.

Dan contoh Microsoft untuk server saat ini adalah:

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

Skenario ini berguna ketika ada beberapa contoh SQL Server yang diinstal di server Windows, dan klien harus membuka sambungan lain ke contoh yang sama yang digunakan oleh sambungan saat ini.

shA.t
sumber
PILIH CONVERT (sysname, SERVERPROPERTY ('servername')); adalah jawaban yang benar
Stefan Steiger
8

Mengapa berhenti di nama instance saja? Anda dapat menginventarisasi lingkungan SQL Server Anda dengan berikut ini:

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.
sumber
1
Good Stuff Nate, saya memiliki skrip Inventaris yang lebih disempurnakan yang melakukan hal yang sama. hubungi saya untuk mendapatkan salinan melalui email ... Skrip tidak akan fokus untuk utas ini.
Hank Freeman
2

Untuk mendapatkan daftar server dan instance yang Anda sambungkan:

select * from Sys.Servers

Untuk mendapatkan daftar database yang memiliki server yang terhubung:

SELECT * from sys.databases;
Saravanan Andavar
sumber
1

Hanya untuk menambahkan beberapa klarifikasi ke kueri registri. Mereka hanya mencantumkan instance bitness yang cocok (32 atau 64) untuk instance saat ini.

Kunci registri sebenarnya untuk instance SQL 32-bit di OS 64-bit adalah:

HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Microsoft SQL Server

Anda dapat menanyakan ini pada instance 64-bit untuk mendapatkan semua instance 32-bit juga. Contoh 32-bit tampaknya terbatas pada Wow6432Node sehingga tidak dapat membaca pohon registri 64-bit.

Colin Campbell
sumber
0

Metode lain untuk menemukan nama Instance- Klik kanan pada nama Database dan pilih Properties, di bagian ini Anda dapat melihat properti koneksi di sudut kiri bawah, klik itu kemudian Anda dapat melihat nama Instance.

Yasin
sumber