¿Cómo puedo determinar las instancias de SQL Server instaladas y sus versiones?

224

Estoy tratando de determinar qué instancias de sql server / sql express he instalado (ya sea manual o programáticamente) pero todos los ejemplos me dicen que ejecute una consulta SQL para determinar esto, lo que supone que ya estoy conectado a una instancia en particular .

Luke
fuente
1
Aquí hay un enlace sobre cómo identificarse con sqlcmd msdn.microsoft.com/en-us/library/ms165662%28v=sql.90%29.aspx
Cómo encontrar sus instancias de SQL Server (nombre del servidor) y versiones youtube.com/watch?v=DLrxFXXeLFk
mloskot
¿Puedes decirme las consultas SQL de las que estás hablando?
LearnByReading
1
@LearnByReading Ver la respuesta de Mohammed Ifteqar Ahmed a continuación.
Lucas
2
Puede interrogar el registro: pmichaels.net/2016/02/12/…
Paul Michaels

Respuestas:

209

En una línea de comando:

SQLCMD -L

o

OSQL -L

(Nota: debe ser una L mayúscula)

Esto enumerará todos los servidores sql instalados en su red. Hay opciones de configuración que puede configurar para evitar que se muestre un SQL Server en la lista. Para hacer esto...

En la línea de comando:

svrnetcn

En la lista de protocolos habilitados, seleccione 'TCP / IP', luego haga clic en propiedades. Hay una casilla de verificación para 'Ocultar servidor'.

George Mastros
fuente
2
Me gustan las opciones de línea de comandos, pero obtuve resultados mixtos cuando los probé en mi cuadro de desarrollador (no en red); básicamente "sqlcmd -L" fue el único que funcionó, y solo si se estaba ejecutando el servicio del navegador SQL Server. ¿Es eso de esperar?
Matt
ME ENCANTA cuando es SIMPLE y RECTO. Estaba luchando por encontrar el nombre de servidor correcto para ingresar a una instancia de SQL Server de Amazon Web Service. Gracias
Mehdi LAMRANI
1
Comandos agradables, pero por alguna razón detectó la instancia de SQLExpress en una red calculada pero no pudo detectar la instancia de SQLExpress en mi máquina local.
sparebytes
1
@sparebytes: razón aquí: dba.stackexchange.com/questions/18499/…
DonBecker
Prueba:C:\> sqllocaldb i
Contango
82

Puede consultar este valor de registro para obtener la versión de SQL directamente:

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

Alternativamente, puede consultar el nombre de su instancia y luego usar sqlcmd con su nombre de instancia que le gustaría:

Para ver el nombre de su instancia:

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

Entonces ejecute esto:

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

Si está usando C ++, puede usar este código para obtener la información del registro.

Brian R. Bondy
fuente
('productversion'), SERVERPROPERTY ('productlevel'), SERVERPROPERTY ('edition') muestra solo un servidor, solo ejecuta uno pero no instancias o servidores instalados pero detenidos
Gennady Vanin Геннадий Ванин
Gracias, la consulta funcionó para mí. Tenía una máquina y quería saber la instancia predeterminada y la instancia de SQL Express que era 2008 y que 2008 R2. Me conecté a cada instancia, ejecuté la consulta y obtuve un número de versión. Buscar en Google los números entonces fue fácil.
Meligy
3
Tenga en cuenta que parece que el "HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Microsoft SQL Server \ <versión> \ Tools \ ClientSetup \ CurrentVersion" y "HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Microsoft SQL Server \ Instance Names" se muestran en la porción de 32 bits del registro, mientras que la ruta real a la instancia: "HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Microsoft SQL Server \ <instancename>" aparece en la Colmena de 64 bits.
NGaida
El registro es la definición de origen del software instalado. Su solución me permite ir directamente a la fuente, en lugar de usar una herramienta CLI, que finalmente usa valores de registro, o el complemento MMC que también usa el registro. Perfecto
barrypicker
76

Todas las instancias instaladas deberían aparecer en el complemento de servicios en la consola de administración de Microsoft. Para obtener los nombres de las instancias, vaya a Inicio | Correr | escriba Services.msc y busque todas las entradas con "Servidor SQL (Nombre de instancia)".

dotnetengineer
fuente
13
Comando equivalente de PowerShell:Get-Service | ?{ $_.Name -like "MSSQL*" }
orad
2
Mi computadora muestra que MSSQL $ SQLEXPRESS se está ejecutando con el nombre para mostrar SQL Server (SQLEXPRESS) ... pero ¿cómo ingreso esto en un nombre de servidor? La conexión de prueba muestra errores como ... se produjo un error relacionado con la red o específico de la instancia al intentar conectarse al servidor sql
webzy
47

- Consulta T-SQL para encontrar la lista de instancias instaladas en una 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
fuente
Bueno uno! Solo creo que es necesario conectarse, sa¿no es así?
jyz
3
+1 La fuente de información sobre las instancias es la misma que la respuesta de Brian. Alguien podría escribir el código C # para obtener el valor del Registro de Windows; lo que me hizo pensar que la respuesta es redundante por el momento, pero es bueno saber sobre xp_regread. #Gracias.
Mzn
Los resultados de la consulta son solo nombres de instancia. ¿Es posible agregar un nivel de compatibilidad para cada instancia a los resultados?
Marwan Almukh
16

Sé que este hilo es un poco viejo, pero me encontré con este hilo antes de encontrar la respuesta que estaba buscando y pensé en compartirla. Si está utilizando SQLExpress (o localdb), hay una forma más sencilla de encontrar los nombres de sus instancias. En una línea de comando, escriba:

> sqllocaldb i

Esto enumerará los nombres de instancia que ha instalado localmente. Por lo tanto, el nombre completo del servidor debe incluir (localdb) \ delante del nombre de la instancia para conectarse. Además, sqllocaldb le permite crear nuevas instancias o eliminarlas, así como configurarlas. Consulte: Utilidad SqlLocalDB .

John Denton
fuente
11

Si solo desea ver qué está instalado en la máquina en la que está conectado actualmente, creo que el proceso manual más directo es simplemente abrir el Administrador de configuración de SQL Server (desde el menú Inicio), que muestra todos los servicios SQL (y solo servicios SQL) en ese hardware (en ejecución o no). Esto supone SQL Server 2005 o superior; La recomendación de dotnetengineer de utilizar la Consola de administración de servicios le mostrará todos los servicios y siempre debe estar disponible (por ejemplo, si está ejecutando versiones anteriores de SQL Server).

Sin embargo, si está buscando un proceso de descubrimiento más amplio, puede considerar herramientas de terceros como SQLRecon y SQLPing, que escanearán su red y generarán un informe de todas las instancias del Servicio SQL encontradas en cualquier servidor al que tengan acceso. Ha pasado un tiempo desde que utilicé herramientas como esta, pero me sorprendió lo que encontraron (es decir, un puñado de casos que no sabía que existían). YMMV. Puede buscar en Google los detalles, pero creo que esta página tiene las descargas relevantes: http://www.sqlsecurity.com/Tools/FreeTools/tabid/65/Default.aspx

Mate
fuente
1
El Administrador de configuración de SQL Server era exactamente lo que necesitaba. Rapido y Facil.
Chris
8

SQL Server permite que las aplicaciones encuentren instancias de SQL Server dentro de la red actual. La clase SqlDataSourceEnumerator expone esta información al desarrollador de la aplicación, proporcionando una tabla de datos que contiene información sobre todos los servidores visibles. Esta tabla devuelta contiene una lista de instancias de servidor disponibles en la red que coincide con la lista proporcionada cuando un usuario intenta crear una nueva conexión y expande la lista desplegable que contiene todos los servidores disponibles en el cuadro de diálogo Propiedades de conexión. Los resultados que se muestran no siempre son completos. Para recuperar la tabla que contiene información sobre las instancias de SQL Server disponibles, primero debe recuperar un enumerador, utilizando la propiedad de instancia compartida / 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("============================");
    }
  }
}

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

Ian
fuente
¿Necesito especificar una subred en este o dominio, está volviendo nulo para mí, ¿podría actualizar
Transformador
1
Para aquellos que buscan usar .NET Core, SqlDataSourceEnumeratoraún no está implementado, pero está en la lista para agregar de acuerdo con el problema de GitHub .
Daniel Hill
5

Servicio de navegador de SQL Server http://msdn.microsoft.com/en-us/library/ms181087.aspx

Cade Roux
fuente
1
¡Uy ... falta sqlbrowser.exe de la ubicación habitual! Debo tener la edición de Microsoft (es decir, la que no funciona) :-) Broma: todos amamos a Microsoft, casi tanto como mi suegra.
Sam
5

Si está interesado en determinar esto en un script, puede intentar lo siguiente:

sc \\server_name query | grep MSSQL

Nota: grep es parte de las herramientas gnuwin32

Dale Sykora
fuente
3
Puede usar en findstrlugar de greppara esto.
Pablo Montilla
También puede usar, ENCONTRAR, que conduce a la consulta sc \\ server_name | ENCUENTRE "MSSQL"
Julio Nobre
5

Desde la línea de comandos de Windows, escriba:

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

Donde "nombre_servidor" es el nombre de cualquier servidor remoto en el que desea mostrar las instancias de SQL.

Esto requiere suficientes permisos, por supuesto.

jimbo
fuente
No funciona en mi máquina de desarrollo, que tiene 2008 R2 y múltiples instancias Express y LocalDB ejecutándose.
Christoph
4

Esta consulta debería obtener el nombre del servidor y el nombre de la instancia:

SELECT @@SERVERNAME, @@SERVICENAME
Anónimo
fuente
3
Esto solo le dice el nombre de la instancia actual asociada con la consulta en ejecución. OP solicitó una lista de todas las instancias instaladas
Jay Walker
1
Esto no proporciona ninguna información sobre qué versión del servidor SQL está instalada
Ahmad el
2

Yo tuve el mismo problema. El comando "osql -L" muestra solo una lista de servidores pero sin nombres de instancia (solo se muestra la instancia de mi servidor SQL local). Con Wireshark, sqlbrowser.exe (que puede encontrar en la carpeta compartida de su instalación de SQL) encontré una solución para mi problema.

La instancia local se resuelve mediante la entrada del registro. Las instancias remotas se resuelven mediante difusión UDP (puerto 1434) y SMB. Use "sqlbrowser.exe -c" para enumerar las solicitudes.

Mi configuración utiliza 1 adaptador de red físico y 3 virtuales. Si utilicé el comando "osql -L", el sqlbrowser mostró una solicitud de uno de los adaptadores virtuales (que está en otro segmento de red), en lugar del físico. osql selecciona el adaptador por su métrica. Puede ver la métrica con el comando "ruta de impresión". Para mi configuración, la tabla de enrutamiento mostró una métrica más baja para el adaptador virtual que para el físico. Así que cambié la métrica de la interfaz en las propiedades de la red deseleccionando la métrica automática en la configuración de red avanzada. osql ahora usa el adaptador físico.

Daniel
fuente
2

Una opción más sería ejecutar el informe de descubrimiento SQLSERVER ... vaya a los medios de instalación de sqlserver y haga doble clic en setup.exe

ingrese la descripción de la imagen aquí

y en la siguiente pantalla, vaya a herramientas y haga clic en informe de descubrimiento como se muestra a continuación

ingrese la descripción de la imagen aquí

Esto le mostrará todas las instancias presentes junto con características completas ... a continuación se muestra una instantánea en mi PC ingrese la descripción de la imagen aquí

TheGameiswar
fuente
1

Acabo de instalar Sql Server 2008, pero no pude conectarme a ninguna instancia de base de datos. Los comandos publicados por @G Mastros no enumeraron instancias activas.

Así que busqué en los servicios y descubrí que el agente del servidor SQL estaba deshabilitado. Lo arreglé configurándolo en automático y luego lo inicié.

Moulde
fuente
1

Tuve este mismo problema cuando estaba evaluando más de 100 servidores, tenía un script escrito en C # para examinar los nombres de servicio que consisten en SQL. Cuando se instalan instancias en el servidor, SQL Server agrega un servicio para cada instancia con el nombre del servicio. Puede variar para diferentes versiones como 2000 a 2008, pero seguramente hay un servicio con nombre de instancia.

Tomo el nombre del servicio y obtengo el nombre de la instancia del nombre del servicio. Aquí está el código de muestra utilizado con el resultado de la 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
fuente
0

Aquí hay un método simple: vaya a Inicio, luego Programas, luego Microsoft SQL Server 2005, luego Herramientas de configuración, luego Administrador de configuración de SQL Server, luego Configuración de red de SQL Server 2005, luego Aquí puede ubicar todas las instancias instaladas en su máquina.

Badar
fuente
0

Sé que es una publicación anterior, pero encontré una buena solución con PoweShell, donde puedes encontrar instancias de SQL instaladas en una máquina local o remota, incluida la versión, y también extender otras propiedades.

$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
fuente
hola, esto es genial, ¿cómo puedo incluir esto dentro de una clase de C # o cómo llamarlo desde el código
Transformador
Hola. Este es mi primer intento de powershell, por lo que agradecería su ayuda. Recibo el siguiente error si intento ejecutar este script. Aldo, ¿encontrará esto todos los servidores SQL remotos? Estoy tratando de compilar una lista de servidores SQL y sus bases de datos. No puede llamar a un método en una expresión de valor nulo. + $ values ​​= $ regkey.GetValueNames ()
Darryl Wilson el
0

Los comandos OSQL -Ly SQLCMD -Lle mostrarán todas las instancias en la red .

Si desea tener una lista de todas las instancias en el servidor y no tiene ganas de hacer secuencias de comandos o programación, haga lo siguiente:

  1. Inicie el Administrador de tareas de Windows
  2. Marque la casilla de verificación "Mostrar procesos de todos los usuarios" o equivalente
  3. Ordenar los procesos por "Nombre de imagen"
  4. Ubica todas las sqlsrvr.exeimágenes

Las instancias deben aparecer en la columna "Nombre de usuario" como MSSQL$INSTANCE_NAME.

Y pasé de pensar que el servidor deficiente ejecutaba 63 instancias a darme cuenta de que ejecutaba tres (de las cuales una se comportaba como un acosador total con la carga de la CPU ...)

Erk
fuente
0

Obtendrá las instancias de la consulta de registro del servidor SQL "HKLM \ Software \ Microsoft \ Microsoft SQL Server \ Instance Names \ SQL"

o use SQLCMD -L

siva
fuente
-1

Si está dentro de SSMS, puede que le resulte más fácil de usar:

SELECT @@Version
Craig
fuente
3
La pregunta en sí dice que no quieren / no pueden usar consultas SQL para determinar la versión
Trotski94