Como posso determinar as instâncias instaladas do SQL Server e suas versões?

224

Estou tentando determinar quais instâncias do sql server / sql express eu instalei (manual ou programaticamente), mas todos os exemplos estão me dizendo para executar uma consulta SQL para determinar isso, considerando que já estou conectado a uma instância específica .

Lucas
fonte
1
Aqui está um link como identificar com sqlcmd msdn.microsoft.com/en-us/library/ms165662%28v=sql.90%29.aspx
Como encontrar o seu instâncias do SQL Server (nome do servidor) e Versões youtube.com/watch?v=DLrxFXXeLFk
mloskot
você pode me dizer as consultas SQL de que está falando?
LearnByReading
1
@LearnByReading Veja a resposta de Mohammed Ifteqar Ahmed abaixo.
22416 Luke
2
Você pode interrogar o registro: pmichaels.net/2016/02/12/…
Paul Michaels

Respostas:

209

Em uma linha de comando:

SQLCMD -L

ou

OSQL -L

(Nota: deve ser L maiúsculo)

Isso listará todos os servidores sql instalados na sua rede. Existem opções de configuração que você pode definir para impedir que um SQL Server seja exibido na lista. Para fazer isso...

Na linha de comando:

svrnetcn

Na lista de protocolos ativados, selecione 'TCP / IP' e clique em propriedades. Há uma caixa de seleção para 'Ocultar servidor'.

George Mastros
fonte
2
Gosto das opções da linha de comando, mas obtive resultados variados quando os experimentei na minha caixa de desenvolvedor (sem rede); basicamente "sqlcmd -L" foi o único que funcionou e somente se o Serviço de Navegador do SQL Server estava em execução. Isso é de se esperar?
Matt
Eu adoro quando é simples e reta. Eu estava lutando para encontrar o nome correto do servidor para inserir uma instância do Amazon Web Service SQL Server. ThanX
Mehdi LAMRANI
1
Comandos agradáveis, mas, por algum motivo, ele detectou a instância SQLExpress em uma rede calculada, mas não conseguiu detectar a instância SQLExpress na minha máquina local.
Sparebytes 5/05
1
@sparebytes: reason here: dba.stackexchange.com/questions/18499/…
DonBecker
Tente:C:\> sqllocaldb i
Contango
82

Você pode consultar esse valor do registro para obter a versão do SQL diretamente:

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\90\Tools\ClientSetup\CurrentVersion

Como alternativa, você pode consultar o nome da instância e, em seguida, usar o sqlcmd com o nome da instância que deseja:

Para ver o nome da sua instância:

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\Instance Names

Em seguida, execute o seguinte:

SELECT SERVERPROPERTY('productversion'), SERVERPROPERTY ('productlevel'), SERVERPROPERTY ('edition')

Se você estiver usando C ++, poderá usar esse código para obter as informações do registro.

Brian R. Bondy
fonte
( 'productversion'), SERVERPROPERTY ( 'ProductLevel'), SERVERPROPERTY ( 'Edition') mostra apenas servidor, executando apenas um, mas não instâncias ou servidores instalados, mas parou
Gennady Vanin Геннадий Ванин
Obrigado, a consulta funcionou para mim. Eu tinha uma máquina e queria saber a instância padrão e a instância do SQL Express que era 2008 e qual 2008 R2. Liguei-me a cada instância e executei a consulta e ele me deu um número de versão. Pesquisando os números então foi fácil.
Melissy
3
Observe que parece que "HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Microsoft SQL Server \ <versão> \ Tools \ ClientSetup \ CurrentVersion" e "HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Microsoft SQL Server \ Instance Names" aparecem na parte 32 bits do registro, enquanto o caminho real para a instância: "HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Microsoft SQL Server \ <nome da instituição>" aparece na seção de 64 bits.
NGaida 11/11
O registro é a definição de origem do software instalado. Sua solução me permite ir diretamente à fonte, em vez de usar uma ferramenta CLI, que finalmente usa valores do registro, ou snap-in do MMC, que também usa o registro. Perfeito
barrypicker
76

Todas as instâncias instaladas devem aparecer no snap-in de serviços no Microsoft Management Console. Para obter os nomes das instâncias, vá para Iniciar | Executar | digite Services.msc e procure todas as entradas com "Sql Server (Instance Name)".

dotnetengineer
fonte
13
Comando equivalente do PowerShell:Get-Service | ?{ $_.Name -like "MSSQL*" }
ou
2
Meu computador mostra que o MSSQL $ SQLEXPRESS está sendo executado com o nome de exibição SQL Server (SQLEXPRESS) .... mas como faço para inserir isso em um nome de servidor? Erros mostra ligação de teste como ... um relacionado rede ou instância específica erro ocorreu ao tentar conectar ao servidor SQL
webzy
47

- Consulta T-SQL para encontrar a lista de instâncias instaladas em uma máquina

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 
Mohammed Ifteqar Ahmed
fonte
Um bom! Eu só acho que é necessário conectar como sanão é?
JYZ
3
+1 A fonte das informações sobre as instâncias é igual à resposta de Brian. Alguém também pode escrever código C # para obter o valor do Registro do Windows; o que me fez pensar que a resposta é redundante por um momento, mas é bom saber sobre xp_regread. #obrigado.
Mzn 29/10
Os resultados da consulta são apenas nomes de instância. É possível adicionar nível de compatibilidade para cada instância aos resultados?
Marwan Almukh
16

Eu sei que esse tópico é um pouco antigo, mas me deparei com ele antes de encontrar a resposta que estava procurando e pensei em compartilhar. Se você estiver usando o SQLExpress (ou localdb), há uma maneira mais simples de encontrar os nomes de suas instâncias. Em uma linha de comando, digite:

> sqllocaldb i

Isso listará os nomes de instância que você instalou localmente. Portanto, o nome completo do servidor deve incluir (localdb) \ na frente do nome da instância para se conectar. Além disso, o sqllocaldb permite criar novas instâncias ou excluí-las e configurá-las. Consulte: Utilitário SqlLocalDB .

John Denton
fonte
11

Se você quiser apenas ver o que está instalado na máquina em que está conectado no momento, acho que o processo manual mais direto é apenas abrir o SQL Server Configuration Manager (no menu Iniciar), que exibe todos os Serviços SQL (e apenas serviços SQL) nesse hardware (em execução ou não). Isso pressupõe o SQL Server 2005 ou superior; A recomendação do dotnetengineer de usar o Console de Gerenciamento de Serviços mostrará todos os serviços e deve estar sempre disponível (se você estiver executando versões anteriores do SQL Server, por exemplo).

Se você estiver procurando por um processo mais amplo de descoberta, no entanto, considere ferramentas de terceiros, como SQLRecon e SQLPing, que verificarão sua rede e criarão um relatório de todas as instâncias do Serviço SQL encontradas em qualquer servidor ao qual eles tenham acesso. Já faz um tempo desde que eu usei ferramentas como essa, mas fiquei surpreso com o que elas encontraram (a saber, algumas instâncias que eu nem sabia que existiam). YMMV. Você pode procurar no Google por detalhes, mas acredito que esta página possui os downloads relevantes: http://www.sqlsecurity.com/Tools/FreeTools/tabid/65/Default.aspx

Matt
fonte
1
O SQL Server Configuration Manager era exatamente o que eu precisava. Rápido e fácil.
Chris
8

O SQL Server permite que os aplicativos encontrem instâncias do SQL Server na rede atual. A classe SqlDataSourceEnumerator expõe essas informações ao desenvolvedor do aplicativo, fornecendo um DataTable contendo informações sobre todos os servidores visíveis. Esta tabela retornada contém uma lista de instâncias do servidor disponíveis na rede que correspondem à lista fornecida quando um usuário tenta criar uma nova conexão e expande a lista suspensa que contém todos os servidores disponíveis na caixa de diálogo Propriedades da Conexão. Os resultados exibidos nem sempre estão completos. Para recuperar a tabela que contém informações sobre as instâncias disponíveis do SQL Server, primeiro você deve recuperar um enumerador usando a propriedade Instância compartilhada / estática:

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("============================");
    }
  }
}

do msdn http://msdn.microsoft.com/en-us/library/a6t1z9x2(v=vs.80).aspx

Ian
fonte
que eu preciso para especificar uma sub-rede sobre este ou domínio, a sua vinda nula de volta para mim, por favor você pode atualização
transformador de
1
Para aqueles que desejam usar o .NET Core, SqlDataSourceEnumeratorainda não foi implementado, mas está na lista a ser adicionada de acordo com o problema do GitHub .
Daniel Hill
5

Serviço de Navegador do SQL Server http://msdn.microsoft.com/en-us/library/ms181087.aspx

Cade Roux
fonte
1
opa ... faltando sqlbrowser.exe do local normal! Eu devo ter a edição da Microsoft (ou seja, a que não funciona) :-) Brincadeira - todos nós gostamos da Microsoft, quase tanto quanto a minha sogra.
Sam
5

Se você estiver interessado em determinar isso em um script, tente o seguinte:

sc \\server_name query | grep MSSQL

Nota: grep faz parte das ferramentas do gnuwin32

Dale Sykora
fonte
3
Você pode usar em findstrvez de fazer grepisso.
Pablo Montilla
Você também pode usar, FIND, o que leva à consulta sc \\ server_name | Encontrar "MSSQL"
Julio Nobre
5

Na linha de comando do Windows, digite:

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

Onde "server_name" é o nome de qualquer servidor remoto no qual você deseja exibir as instâncias SQL.

Isso requer permissões suficientes, é claro.

jimbo
fonte
Não está funcionando na minha máquina de desenvolvimento, que possui 2008 R2 e várias instâncias Express e LocalDB em execução.
Christoph
4

Esta consulta deve fornecer o nome do servidor e o nome da instância:

SELECT @@SERVERNAME, @@SERVICENAME
Anônimo
fonte
3
Isso informa apenas o nome da instância atual associada à consulta em execução. O OP solicitou uma lista de todas as instâncias instaladas
Jay Walker
1
Esta não fornece qualquer informação sobre a versão do servidor SQL está instalado
Ahmad
2

Eu tive o mesmo problema. O comando "osql -L" exibia apenas uma lista de servidores, mas sem nomes de instância (apenas a instância do meu servidor SQL local era exibida). Com o Wireshark, o sqlbrowser.exe (que pode ser encontrado na pasta compartilhada da sua instalação do SQL), encontrei uma solução para o meu problema.

A instância local é resolvida pela entrada do Registro. As instâncias remotas são resolvidas pela transmissão UDP (porta 1434) e SMB. Use "sqlbrowser.exe -c" para listar as solicitações.

Minha configuração usa 1 adaptadores de rede físicos e 3 virtuais. Se eu usei o comando "osql -L", o sqlbrowser exibiu uma solicitação de um dos adaptadores virtuais (que está em outro segmento de rede), em vez do físico. o osql seleciona o avaliador por sua métrica. Você pode ver a métrica com o comando "route print". Para minha configuração, a tabela de roteamento mostrou uma métrica mais baixa para o adaptador virtual do que para o físico. Então, alterei a métrica da interface nas propriedades da rede, desmarcando a métrica automática nas configurações avançadas da rede. o osql agora usa o adaptador físico.

Daniel
fonte
2

Mais uma opção seria executar o relatório de descoberta SQLSERVER ... vá para a mídia de instalação do sqlserver e clique duas vezes em setup.exe

insira a descrição da imagem aqui

e na próxima tela, vá para ferramentas e clique em relatório de descoberta, como mostrado abaixo

insira a descrição da imagem aqui

Isso mostrará todas as instâncias presentes, além de todos os recursos ... abaixo é um instantâneo no meu pc insira a descrição da imagem aqui

TheGameiswar
fonte
1

Acabei de instalar o Sql server 2008, mas não consegui conectar-me a nenhuma instância do banco de dados. Os comandos publicados pelo @G Mastros não listaram nenhuma instância ativa.

Então, procurei nos serviços e descobri que o agente do servidor SQL estava desativado. Corrigi-o, definindo-o como automático e iniciando-o.

Moulde
fonte
1

Eu tive esse mesmo problema quando avaliava mais de 100 servidores, tinha um script escrito em C # para procurar os nomes dos serviços que consistem em SQL. Quando instâncias instaladas no servidor, o SQL Server adiciona um serviço para cada instância com o nome do serviço. Pode variar para versões diferentes, como 2000 a 2008, mas com certeza existe um serviço com o nome da instância.

Pego o nome do serviço e obtenho o nome da instância no nome do serviço. Aqui está o código de exemplo usado com o resultado da consulta 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
fonte
0

Aqui está um método simples: vá para Iniciar, Programas, Microsoft SQL Server 2005, Ferramentas de configuração, SQL Server Configuration Manager e SQL Server 2005 Network Configuration e Aqui você pode localizar toda a instância instalada em sua máquina.

Badar
fonte
0

Eu sei que é um post antigo, mas encontrei uma boa solução com o PoweShell, onde você pode encontrar instâncias SQL instaladas em uma máquina local ou remota, incluindo a versão e também estender, obter outras propriedades.

$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}
akhila vangala
fonte
oi isso é ótimo, como, posso envolvê-lo dentro de uma classe c # ou como chamar isso de código
transformador
Oi. Esta é a minha primeira tentativa de PowerShell, então sua ajuda seria apreciada. Eu recebo o seguinte erro se tentar executar este script. Aldo irá encontrar todos os servidores sql remotos? Estou tentando compilar uma lista de servidores SQL e seus bancos de dados. Você não pode chamar um método em uma expressão de valor nulo. + $ values ​​= $ regkey.GetValueNames ()
Darryl Wilson
0

Os comandos OSQL -Le SQLCMD -Lmostrarão todas as instâncias na rede .

Se você deseja ter uma lista de todas as instâncias no servidor e não deseja executar scripts ou programação, faça o seguinte:

  1. Inicie o Gerenciador de tarefas do Windows
  2. Marque a caixa de seleção "Mostrar processos de todos os usuários" ou equivalente
  3. Classifique os processos por "Nome da imagem"
  4. Localize todas as sqlsrvr.exeimagens

As instâncias devem estar listadas na coluna "Nome do usuário" como MSSQL$INSTANCE_NAME.

E passei a pensar que o servidor ruim estava executando 63 instâncias e percebi que estava executando três (das quais uma estava se comportando como um valentão total com a carga da CPU ...)

Erk
fonte
0

Obterá as instâncias da consulta de registro do servidor SQL "HKLM \ Software \ Microsoft \ Microsoft SQL Server \ Nomes de Instância \ SQL"

ou Use SQLCMD -L

siva
fonte
-1

Se você estiver no SSMS, poderá achar mais fácil usar:

SELECT @@Version
Craig
fonte
3
A questão em si afirma que eles não querem / não são capazes de usar consultas SQL para determinar a versão
Trotski94