Як я можу визначити встановлені екземпляри SQL Server та їх версії?


224

Я намагаюся визначити, які екземпляри сервера / sql express я встановив (вручну або програмно), але всі приклади дозволяють мені запустити SQL-запит, щоб визначити це, що передбачає, що я вже підключений до конкретного екземпляра .


1
Ось посилання, як визначитись з sqlcmd msdn.microsoft.com/en-us/library/ms165662%28v=sql.90%29.aspx

Як знайти екземпляри SQL Server (Ім'я сервера) та версії youtube.com/watch?v=DLrxFXXeLFk
mloskot

чи можете ви сказати мені запити SQL, про які ви говорите?
LearnByReading

1
@LearnByReading Дивіться відповідь Мухаммеда Іфтекара Ахмеда нижче.
Лука

2
Ви можете допитатись у реєстрі: pmichaels.net/2016/02/12/…
Пол Майклс

Відповіді:


209

У командному рядку:

SQLCMD -L

або

OSQL -L

(Примітка: має бути велика літера L)

Тут буде перераховано всі сервери sql, встановлені у вашій мережі. Є параметри конфігурації, які можна встановити, щоб запобігти появі SQL Server у списку. Зробити це...

У командному рядку:

svrnetcn

У списку увімкнених протоколів виберіть "TCP / IP", а потім натисніть "Властивості". Існує прапорець "Сховати сервер".


2
Мені подобаються параметри командного рядка, але я отримав неоднозначні результати, коли спробував їх на своєму (немережевому) вікні розробника; в основному "sqlcmd -L" був єдиним, хто працював, і лише якщо служба браузера SQL Server працює. Це варто очікувати?
Метт

Я люблю це, коли це ПРОСТО і ПРАВО. Я намагався знайти правильне ім’я сервера, щоб ввести екземпляр SQL Server Amazon Web Service. ThanX
Мехді ЛАМРАНІ

1
Приємні команди, але чомусь він виявив екземпляр SQLExpress у мережі, що обчислюється, але не вдалося виявити екземпляр SQLExpress на моїй локальній машині.
запчастини

1
@sparebytes: причина тут: dba.stackexchange.com/questions/18499/…
DonBecker

Спробуйте:C:\> sqllocaldb i
Контанго

82

Ви можете запитати це значення реєстру, щоб отримати версію 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')

Якщо ви використовуєте C ++, ви можете використовувати цей код, щоб отримати інформацію про реєстр.


('productversion'), SERVERPROPERTY ('productlevel'), SERVERPROPERTY ('видання') показує лише сервер, лише один, але не інстанції або встановлені, але зупинені сервери
Геннадій Ванін Геннадій Ванін

Дякую, запит працював у мене. У мене була машина і хотіла знати екземпляр за замовчуванням і екземпляр SQL Express, який був 2008 і який 2008 R2. Я підключився до кожного примірника і запустив запит, і він отримав мені номер версії. Гугнути цифри тоді було легко.
Мелігія

3
Зауважте, схоже, що "HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Microsoft SQL Server \ <version> \ Tools \ ClientSetup \ CurrentVersion" та "HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Microsoft SQL Server \ Імена екземпляра" відображається в 32-бітній частині частини реєстру, а фактичний шлях до екземпляра: "HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Microsoft SQL Server \ <ім'я речовини>" відображається у 64-бітовому вулику.
NGaida

Реєстр - це вихідне визначення встановленого програмного забезпечення. Ваше рішення дозволяє мені переходити безпосередньо до джерела, а не використовувати інструмент CLI, який в кінцевому підсумку використовує значення реєстру, або оснащення MMC, в якому також використовується реєстр. Ідеально
barrypicker

76

Усі встановлені екземпляри повинні відображатися в оснастці служб на консолі управління Microsoft. Щоб отримати імена екземплярів, перейдіть до Пуск | Виконати | введіть Services.msc і знайдіть усі записи з "Сервер Sql (ім'я екземпляра)".


13
Еквівалентна команда PowerShell:Get-Service | ?{ $_.Name -like "MSSQL*" }
orad

2
На моєму комп’ютері показано, що MSSQL $ SQLEXPRESS працює з відображуваним іменем SQL Server (SQLEXPRESS) .... але як я можу це ввести ім'я сервера? Підключення до тесту показує помилки, такі як ... помилка, пов’язана з мережею або примірником, сталася під час спроби підключення до сервера sql
webzy

47

- T-SQL Query для пошуку списку інстанцій, встановлених на машині

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ні?
jyz

3
+1 Джерело інформації про примірники те саме, що відповідь Брайана. Хтось може також написати C # код, щоб отримати значення з Реєстру Windows; що змусило мене думати, що відповідь на даний момент є зайвою, але приємно знати про xp_regread. #Дякую.
Mzn

Результати запиту - це лише імена екземплярів, чи можна до результатів додати рівень сумісності для кожного примірника?
Марван Алмух

16

Я знаю, що ця тема трохи стара, але я натрапив на цю тему, перш ніж знайшов відповідь, яку шукав, і думав, що поділюсь. Якщо ви використовуєте SQLExpress (або localdb), існує більш простий спосіб знайти імена ваших примірників. У командному рядку:

> sqllocaldb i

Тут буде перелічено імена екземплярів, які ви встановили локально. Отже, ваше повне ім’я сервера повинно містити (localdb) \ перед іменем екземпляра для підключення. Також sqllocaldb дозволяє створювати нові екземпляри або видаляти їх, а також налаштовувати їх. Див.: Утиліта SqlLocalDB .


11

Якщо ви просто хочете побачити, що встановлено на машині, на якій ви зараз увійшли в систему, я вважаю, що найпростішим ручним процесом є просто відкрити менеджер конфігурацій SQL Server (у меню "Пуск"), де відображаються всі служби SQL (і лише сервіси SQL) на цьому апаратному забезпеченні (працює чи ні). Це передбачає, що SQL Server 2005 або вище; Рекомендація dotnetengineer щодо використання консолі управління послугами покаже вам усі сервіси та завжди має бути доступною (наприклад, якщо ви використовуєте більш ранні версії SQL Server).

Якщо ви шукаєте більш широкий процес виявлення, однак, ви можете врахувати сторонні інструменти, такі як SQLRecon та SQLPing, які сканують вашу мережу та створюють звіт про всі екземпляри служби SQL, знайдені на будь-якому сервері, до якого вони мають доступ. Минув такий час, як я використовував подібні інструменти, але мене здивувало те, що вони знайшли (а саме, кілька примірників, про які я не знав). YMMV. Ви можете отримати Google для детальної інформації, але я вважаю, що ця сторінка має відповідні завантаження: http://www.sqlsecurity.com/Tools/FreeTools/tabid/65/Default.aspx


1
Менеджер конфігурації SQL Server був саме тим, що мені було потрібно. Швидко і просто.
Кріс

8

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


чи потрібно мені вказати підмережу на цьому або домені, його повернення для мене недійсне, можна оновити
трансформатор

1
Для тих, хто хоче використовувати .NET Core, SqlDataSourceEnumeratorще не реалізований, але є у списку, який слід додати відповідно до випуску GitHub .
Даніель Хілл


5

Якщо вам цікаво визначити це у сценарії, ви можете спробувати наступне:

sc \\server_name query | grep MSSQL

Примітка: grep є частиною інструментів gnuwin32


3
Ви можете використовувати findstrзамість grepцього.
Пабло Монтілья

Ви також можете використовувати, ЗНАЙТИ, що призводить до запиту sc \\ сервера | ЗНАЙТИ "MSSQL"
Хуліо Нобре

5

У командному рядку Windows введіть:

SC \\server_name query | find /I "SQL Server ("

Де "ім'я_сервера" - це ім'я будь-якого віддаленого сервера, на якому ви бажаєте відобразити екземпляри SQL.

Це вимагає достатнього дозволу, звичайно.


Не працює на моїй розробниковій машині, на якій працює 2008 R2 та кілька екземплярів Express і LocalDB.
Крістоф

4

Цей запит повинен отримати вам ім’я сервера та ім'я екземпляра:

SELECT @@SERVERNAME, @@SERVICENAME

3
Це вказує лише ім'я поточного екземпляра, пов'язаного з виконанням запиту. ОП просила перелік усіх встановлених примірників
Jay Walker

1
Це не дає ніякої інформації про те, яка версія SQL-сервера встановлена
Ахмад

2

У мене була така ж проблема. Команда "osql -L" відображала лише список серверів, але без імен екземплярів (відображався лише екземпляр мого локального SQL Sever). З Wireshark, sqlbrowser.exe (який можна знайти у спільній папці вашої установки SQL), я знайшов рішення для своєї проблеми.

Локальний примірник вирішується за допомогою запису реєстру. Віддалені екземпляри вирішуються трансляцією UDP (порт 1434) та SMB. Використовуйте "sqlbrowser.exe -c" для списку запитів.

Моя конфігурація використовує 1 фізичний та 3 віртуальні мережні адаптери. Якщо я використовував команду "osql -L", sqlbrowser відображає запит від одного з віртуальних адаптерів (який знаходиться в іншому сегменті мережі), а не фізичного. osql вибирає адаптера за його метрикою. Ви можете побачити показник із командою "print print". Для моєї конфігурації таблиця маршрутизації показала нижчу метрику для віртуального адаптера, а потім для фізичного. Тому я змінив метрику інтерфейсу у властивостях мережі, скасувавши вибір автоматичної метрики в розширених мережевих налаштуваннях. osql тепер використовує фізичний адаптер.


2

Ще одним варіантом буде запуск звіту про виявлення SQLSERVER .. перехід до інсталяційного носія sqlserver та подвійного клацання setup.exe

введіть тут опис зображення

а на наступному екрані перейдіть до інструментів та натисніть звіт про виявлення, як показано нижче

введіть тут опис зображення

Це покаже всі наявні екземпляри разом із усіма функціями. Нижче наведено знімок на моєму ПК введіть тут опис зображення


1

Щойно я встановив сервер Sql 2008, але мені не вдалося підключитися до жодних екземплярів бази даних. Команди @G Mastros розміщено в списку відсутні активні екземпляри.

Тому я заглянув у сервіси і виявив, що агент сервера SQL відключений. Я зафіксував його, встановивши його на автоматичне, а потім запустив.


1

У мене була ця сама проблема, коли я оцінював 100+ серверів, у мене був написаний скрипт на C # для перегляду імен служб, що складаються з SQL. Коли інстанції, встановлені на сервері, 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);
                    }

0

Ось простий метод: перейдіть до «Пуск», потім «Програми», потім «Microsoft SQL Server 2005», потім «Інструменти конфігурації», потім «Менеджер конфігурації SQL Server», потім «Конфігурація мережі SQL Server 2005», а потім ви можете знайти всі встановлені на вашій машині екземпляри.


0

Я знаю, що це старий пост, але я знайшов хороше рішення з PoweShell, де ви можете знайти екземпляри SQL, встановлені на локальній або віддаленій машині, включаючи версію, а також розширити, отримати інші властивості.

$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}

привіт, це чудово, як, чи можу я загорнути це у клас C # або як викликати це з коду
трансформер

Привіт. Це моя перша спроба розширення захисту, тому ваша допомога буде вдячна. Якщо я спробую запустити цей сценарій, я отримаю таку помилку. Aldo знайде всі віддалені сервери sql? Я намагаюся скласти список серверів SQL та їх баз даних. Ви не можете викликати метод з нульовим виразом. + $ values ​​= $ regkey.GetValueNames ()
Дарріл Вілсон

0

Команди OSQL -Lі SQLCMD -Lпокажуть вам всі екземпляри в мережі .

Якщо ви хочете мати список усіх примірників на сервері і вам не здається робити сценарії чи програмування, зробіть це:

  1. Запустіть диспетчер завдань Windows
  2. Поставте прапорець "Показати процеси від усіх користувачів" або подібний
  3. Сортуйте процеси за "Іменем зображення"
  4. Знайдіть усі sqlsrvr.exeзображення

Екземпляри повинні бути вказані у стовпці "Ім'я користувача" як MSSQL$INSTANCE_NAME.

І я пішов від думки, що поганий сервер працює 63 екземплярами, щоб зрозуміти, що він працює на трьох (з яких один поводився як загальний хуліган із завантаженням процесора ...)


0

Отримають екземпляри регресного запиту SQL сервера "HKLM \ Software \ Microsoft \ Microsoft SQL Server \ Імена екземплярів \ SQL"

або Використовуйте SQLCMD -L


-1

Якщо ви знаходитесь у SSMS, вам може бути легше використовувати:

SELECT @@Version

3
У самому питанні йдеться про те, що вони не хочуть / не в змозі використовувати SQL-запити для визначення версії
Trotski94
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.