Как определить установленные экземпляры SQL Server и их версии?

224

Я пытаюсь определить, какие экземпляры sql server / 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
Вы можете опросить
Пол Майклз

Ответы:

209

В командной строке:

SQLCMD -L

или

OSQL -L

(Примечание: должен быть заглавной буквы L)

Это перечислит все серверы sql, установленные в вашей сети. Существуют параметры конфигурации, которые можно настроить для предотвращения отображения SQL Server в списке. Сделать это...

В командной строке:

svrnetcn

В списке включенных протоколов выберите «TCP / IP», затем нажмите «Свойства». Есть флажок «Скрыть сервер».

Джордж Мастрос
источник
2
Мне нравятся параметры командной строки, но я получил смешанные результаты, когда попробовал их на моем (не сетевом) окне разработчика; в основном, работал только sqlcmd -L, и только если запущена служба браузера SQL Server. Этого следовало ожидать?
Мэтт
Я люблю это, когда это просто и прямо. Я изо всех сил пытался найти правильное имя сервера для ввода для экземпляра SQL Server Amazon Web Service. Спасибо
Мехди ЛАМРАНИ
1
Хорошие команды, но по какой-то причине он обнаружил экземпляр SQLExpress в сети, но не смог обнаружить экземпляр SQLExpress на моей локальной машине.
Резервные байты
1
@sparebytes: причина здесь: dba.stackexchange.com/questions/18499/…
DonBecker,
Попробуйте:C:\> sqllocaldb i
Contango
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 ('edition') показывает только сервер, на котором запущен только один экземпляр, но не установлены или установлены, но остановлены серверы
Геннадий Ванин Геннадий Ванин
Спасибо, у меня сработал запрос. У меня была машина, и я хотел знать экземпляр по умолчанию и экземпляр SQL Express, который был 2008 и 2008 R2. Я подключился к каждому экземпляру и выполнил запрос, и он получил номер версии. Гуглить цифры тогда было легко.
Meligy
3
Обратите внимание, что похоже на то, что «HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Microsoft SQL Server \ <версия> \ Tools \ ClientSetup \ CurrentVersion» и «HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Microsoft SQL Server \ Имена экземпляров» отображается в 32-разрядной части реестра, а фактический путь к экземпляру: «HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Microsoft SQL Server \ <instancename>» отображается в 64-битном кусте.
Нгаида
Реестр является исходным определением установленного программного обеспечения. Ваше решение позволяет мне перейти непосредственно к источнику, а не использовать инструмент CLI, который в конечном итоге использует значения реестра, или оснастку MMC, которая также использует реестр. Perfect
barrypicker
76

Все установленные экземпляры должны отображаться в оснастке служб в консоли управления Microsoft. Чтобы получить имена экземпляров, перейдите в Пуск | Запустить | введите Services.msc и найдите все записи с «Sql Server (имя экземпляра)».

dotnetengineer
источник
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 Utility .

Джон Дентон
источник
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

Matt
источник
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

Ян
источник
мне нужно указать подсеть в этом или домене, для меня она возвращается null, не могли бы вы обновить
трансформер
1
Для тех, кто хочет использовать .NET Core, SqlDataSourceEnumeratorеще не реализован, но находится в списке, который будет добавлен в соответствии с проблемой GitHub .
Даниэль Хилл
5

Служба браузера SQL Server http://msdn.microsoft.com/en-us/library/ms181087.aspx

Кейд Ру
источник
1
упс ... отсутствует sqlbrowser.exe из обычного места! У меня должна быть версия Microsoft (т.е. та, которая не работает) :-) Шучу - мы все любим Microsoft, почти так же сильно, как моя свекровь.
Сэм
5

Если вы заинтересованы в определении этого в сценарии, вы можете попробовать следующее:

sc \\server_name query | grep MSSQL

Примечание: grep является частью инструментов gnuwin32

Дейл Сикора
источник
3
Вы можете использовать findstrвместо grepэтого.
Пабло Монтилья
Вы также можете использовать FIND, что приводит к запросу sc \\ server_name | НАЙТИ "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). С Wireshark, sqlbrowser.exe (который может быть найден в общей папке вашей установки SQL) я нашел решение для моей проблемы.

Локальный экземпляр разрешается с помощью записи реестра. Удаленные экземпляры разрешаются с помощью широковещательной рассылки UDP (порт 1434) и SMB. Используйте «sqlbrowser.exe -c» для вывода списка запросов.

Моя конфигурация использует 1 физический и 3 виртуальных сетевых адаптера. Если я использовал команду «osql -L», sqlbrowser отображал запрос от одного из виртуальных адаптеров (который находится в другом сегменте сети) вместо физического. osql выбирает adpater по его метрике. Вы можете увидеть метрику с помощью команды «Печать маршрута». Для моей конфигурации таблица маршрутизации показала меньшую метрику для виртуального адаптера, чем для физического. Поэтому я изменил метрику интерфейса в свойствах сети, отменив автоматическую метрику в дополнительных настройках сети. osql теперь использует физический адаптер.

Даниил
источник
2

Еще один вариант - запустить отчет об обнаружении SQLSERVER. Перейдите на установочный носитель sqlserver и дважды щелкните файл setup.exe.

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

и на следующем экране перейдите к инструментам и нажмите отчет об обнаружении, как показано ниже

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

Это покажет вам все имеющиеся экземпляры вместе со всеми функциями .. ниже приведен снимок на моем компьютере введите описание изображения здесь

TheGameiswar
источник
1

Я только что установил Sql server 2008, но мне не удалось подключиться ни к одному экземпляру базы данных. Команды @G Mastros размещены в списке нет активных экземпляров.

Поэтому я посмотрел в службах и обнаружил, что агент сервера SQL был отключен. Я исправил это, установив его на автоматический, а затем запустив.

Moulde
источник
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);
                    }
AbuTaareq
источник
0

Вот простой способ: перейдите в «Пуск», затем «Программы», затем Microsoft SQL Server 2005, затем «Конфигурационные инструменты», затем «Диспетчер конфигурации SQL Server», затем «Конфигурация сети SQL Server 2005», затем. Здесь можно найти все экземпляры, установленные на вашем компьютере.

Badar
источник
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 # или как вызвать это из кода
трансформер
Здравствуй. Это моя первая попытка в PowerShell, поэтому мы будем благодарны за вашу помощь. Я получаю следующую ошибку, если я пытаюсь запустить этот скрипт. Альдо это найдет все удаленные серверы SQL? Я пытаюсь составить список серверов SQL и их баз данных. Вы не можете вызвать метод для выражения с нулевым значением. + $ values ​​= $ regkey.GetValueNames ()
Дэррил Уилсон,
0

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

Если вы хотите иметь список всех экземпляров на сервере и не хотите создавать сценарии или программировать, сделайте следующее:

  1. Запустите диспетчер задач Windows
  2. Установите флажок «Показывать процессы от всех пользователей» или эквивалентный
  3. Сортировать процессы по «Имени изображения»
  4. Найдите все sqlsrvr.exeизображения

Экземпляры должны быть перечислены в столбце «Имя пользователя» как MSSQL$INSTANCE_NAME.

И я подумал, что на плохом сервере было запущено 63 экземпляра, и понял, что на нем запущено три сервера (из которых один вел себя как полный хулиган с нагрузкой на процессор ...)

простофиля
источник
0

Получит экземпляры SQL-сервера reg запрос "HKLM \ Software \ Microsoft \ Microsoft SQL Server \ Имена экземпляров \ SQL"

или используйте SQLCMD -L

шива
источник
-1

Если вы находитесь в SSMS, вам может быть проще использовать:

SELECT @@Version
Craig
источник
3
Сам вопрос гласит, что они не хотят / не могут использовать SQL-запросы для определения версии
Trotski94