내가 수동으로 또는 프로그래밍 방식으로 설치 한 SQL Server / SQL Express 인스턴스를 결정하려고하지만 모든 예제는 이미 특정 인스턴스에 연결되어 있다고 가정하는 SQL 쿼리를 실행하도록 지시합니다. .
내가 수동으로 또는 프로그래밍 방식으로 설치 한 SQL Server / SQL Express 인스턴스를 결정하려고하지만 모든 예제는 이미 특정 인스턴스에 연결되어 있다고 가정하는 SQL 쿼리를 실행하도록 지시합니다. .
답변:
명령 행에서 :
SQLCMD -L
또는
OSQL -L
(참고 : 대문자 L이어야합니다)
네트워크에 설치된 모든 SQL Server가 나열됩니다. SQL Server가 목록에 표시되지 않도록 설정할 수있는 구성 옵션이 있습니다. 이것을하기 위해...
명령 행에서 :
svrnetcn
활성화 된 프로토콜 목록에서 'TCP / IP'를 선택한 다음 속성을 클릭하십시오. '서버 숨기기'확인란이 있습니다.
C:\> sqllocaldb i
이 레지스트리 값을 쿼리하여 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')
설치된 모든 인스턴스가 Microsoft Management Console의 서비스 스냅인에 표시되어야합니다. 인스턴스 이름을 얻으려면 시작 | 실행 | Services.msc를 입력하고 "Sql Server (인스턴스 이름)"가있는 모든 항목을 찾습니다.
Get-Service | ?{ $_.Name -like "MSSQL*" }
-머신에 설치된 인스턴스 목록을 찾기위한 T-SQL 쿼리
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
아닌 것처럼 연결해야한다고 생각 합니까?
나는이 스레드가 조금 오래되었다는 것을 알고 있지만, 내가 찾고있는 대답을 찾고 공유 할 것이라고 생각하기 전에이 스레드를 발견했습니다. SQLExpress (또는 localdb)를 사용하는 경우 인스턴스 이름을 찾는 간단한 방법이 있습니다. 명령 행에서 다음을 입력하십시오.
> sqllocaldb i
로컬로 설치 한 인스턴스 이름이 나열됩니다. 따라서 전체 서버 이름은 연결할 인스턴스 이름 앞에 (localdb) \를 포함해야합니다. 또한 sqllocaldb를 사용하면 새 인스턴스를 생성하거나 삭제하고 구성 할 수 있습니다. SqlLocalDB 유틸리티를 참조하십시오 .
현재 로그인 한 컴퓨터에 설치된 항목을 보려면 가장 간단한 수동 프로세스는 모든 SQL 서비스를 표시하는 시작 메뉴에서 SQL Server 구성 관리자를 여는 것입니다. 해당 하드웨어의 SQL 서비스 만 (실행 또는 실행 안함) 이것은 SQL Server 2005 이상을 가정합니다. 서비스 관리 콘솔을 사용하는 dotnetengineer 의 권장 사항은 모든 서비스를 표시하며 항상 사용할 수 있어야합니다 (예 : 이전 버전의 SQL Server를 실행중인 경우).
그러나보다 광범위한 검색 프로세스를 찾고 있다면 SQLRecon 및 SQLPing과 같은 타사 도구를 사용하여 네트워크를 검색하고 액세스 권한이있는 서버에서 발견 된 모든 SQL 서비스 인스턴스에 대한 보고서를 작성할 수 있습니다. 이와 같은 도구를 사용한 지 오래되었지만, 그들이 찾은 것, 즉 내가 알지 못하는 소수의 인스턴스에 놀랐습니다. YMMV. 자세한 내용은 Google을 참조하십시오. 그러나이 페이지에는 관련 다운로드가 있다고 생각합니다. http://www.sqlsecurity.com/Tools/FreeTools/tabid/65/Default.aspx
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에서
SqlDataSourceEnumerator
은 아직 구현되지 않았지만 GitHub 문제 에 따라 추가 될 목록에 있습니다 .
SQL Server 브라우저 서비스 http://msdn.microsoft.com/en-us/library/ms181087.aspx
스크립트에서이를 결정하려면 다음을 시도하십시오.
sc \\server_name query | grep MSSQL
참고 : grep은 gnuwin32 도구의 일부입니다
findstr
대신에 사용할 수 있습니다 grep
.
이 쿼리는 서버 이름과 인스턴스 이름을 가져옵니다.
SELECT @@SERVERNAME, @@SERVICENAME
나는 같은 문제가 있었다. "osql -L"명령은 서버 이름 만 표시하고 인스턴스 이름은 표시하지 않았습니다 (내 로컬 SQL Sever 인스턴스 만 표시됨). Wireshark, sqlbrowser.exe (SQL 설치의 공유 폴더에서 찾을 수 있음)를 사용하여 문제에 대한 해결책을 찾았습니다.
로컬 인스턴스는 레지스트리 항목으로 해결됩니다. 원격 인스턴스는 UDP 브로드 캐스트 (포트 1434) 및 SMB에 의해 분석됩니다. "sqlbrowser.exe -c"를 사용하여 요청을 나열하십시오.
내 구성은 1 개의 물리적 및 3 개의 가상 네트워크 어댑터를 사용합니다. "osql -L"명령을 사용한 경우 sqlbrowser는 물리적 어댑터 대신 가상 어댑터 중 하나 (다른 네트워크 세그먼트에 있음)의 요청을 표시했습니다. osql은 메트릭으로 adpater를 선택합니다. "route print"명령으로 메트릭을 볼 수 있습니다. 내 구성에서 라우팅 테이블은 가상 어댑터보다 물리적 어댑터보다 낮은 메트릭을 보여주었습니다. 고급 네트워크 설정에서 자동 메트릭을 선택 취소하여 네트워크 속성에서 인터페이스 메트릭을 변경했습니다. osql은 이제 물리적 어댑터를 사용합니다.
100 대 이상의 서버를 평가할 때도 동일한 문제가 발생했으며 SQL로 구성된 서비스 이름을 찾아보기 위해 C #으로 작성된 스크립트가있었습니다. 서버에 인스턴스가 설치되면 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);
}
오래된 게시물을 알고 있지만 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}
명령 OSQL -L
및 네트워크의SQLCMD -L
모든 인스턴스 를 표시합니다 .
서버 의 모든 인스턴스 목록을 원 하고 스크립팅이나 프로그래밍을하고 싶지 않다면 다음과 같이하십시오.
sqlsrvr.exe
이미지 찾기인스턴스는 "사용자 이름"열에로 표시되어야합니다 MSSQL$INSTANCE_NAME
.
그리고 가난한 서버가 63 개의 인스턴스를 실행 중이라는 생각에서 3 개의 서버가 실행 중이라는 것을 깨닫기 시작했습니다 (이 중 하나는 CPU 부하로 총 깡패처럼 행동합니다 ...)