วิธีรับชื่ออินสแตนซ์ปัจจุบันจาก T-SQL


91

ฉันจะรับเซิร์ฟเวอร์ SQL Server และชื่ออินสแตนซ์ของการเชื่อมต่อปัจจุบันโดยใช้สคริปต์ T-SQL ได้อย่างไร


คำตอบที่ยอมรับนั้นถูกต้อง ผลิตผลที่จำเป็นในการเชื่อมต่อการใช้SELECT @@SERVERNAME sqlcmd -Sถ้าเป็นอินสแตนซ์ MSSQLSERVER ดีฟอลต์ก็ต้องไม่ระบุ -S ในพารามิเตอร์ -S นี่คือใน 2017 14.0.2002.14 รุ่นสำหรับนักพัฒนา 64 บิต
สว่าง

คำตอบ:


166

เพิ่งพบคำตอบในคำถาม SO นี้ (ตามตัวอักษรในคำถามไม่ใช่คำตอบใด ๆ ):

SELECT @@servername

ส่งคืน servername \ instance เท่าที่จะไม่ใช่อินสแตนซ์เริ่มต้น

SELECT @@servicename

ส่งคืนชื่ออินสแตนซ์แม้ว่าจะเป็นค่าเริ่มต้น (MSSQLSERVER)


1
@blasto ซึ่งดูเหมือนจะเป็นพฤติกรรมเมื่ออินสแตนซ์เป็นค่าเริ่มต้นที่เซิร์ฟเวอร์ ลองใช้อินสแตนซ์ที่มีชื่อ ตรวจสอบสิ่งนี้: technet.microsoft.com/en-us/library/ms187944.aspx
Guillermo Gutiérrez

10
ไม่ถูกต้องใช้ @@ ชื่อเซิร์ฟเวอร์อาจให้คำตอบที่ผิด SELECT CONVERT (sysname, SERVERPROPERTY ('servername')) เป็นคำตอบที่ถูกต้อง @@ ServerName รายงานชื่อคลัสเตอร์ SQL ในขณะที่ serverproperty ('servername') รายงานชื่อคลัสเตอร์ Windows คุณต้องใช้ชื่อคลัสเตอร์ Windows เพื่อเชื่อมต่อกับฐานข้อมูลของคุณ (ชื่อคลัสเตอร์ของ Windows อาจแตกต่างจากชื่อคลัสเตอร์ SQL โดยปกติจะเกิดขึ้นเมื่อคุณติดตั้งเซิร์ฟเวอร์ sql เวอร์ชันใหม่บนเครื่องอื่น (@@ servername = Environment.MachineName) และต้องการคงชื่อเก่าไว้เพื่อที่คุณจะได้ไม่ต้องเปลี่ยนการกำหนดค่าทั้งหมด)
Stefan Steiger

1
@StefanSteiger คำตอบที่ได้รับการยอมรับของคำถาม SO ที่เชื่อมโยงบ่งชี้วิธีแก้ปัญหาที่คุณนำเสนอ แต่ความคิดเห็นระบุว่าไม่ได้ผลสำหรับบางคน
Trisped

17

แล้วสิ่งนี้ล่ะ:

EXECUTE xp_regread @rootkey='HKEY_LOCAL_MACHINE',
                   @key='SOFTWARE\Microsoft\Microsoft SQL Server\Instance Names\SQl',
                   @value_name='MSSQLSERVER'

ซึ่งจะได้รับชื่ออินสแตนซ์เช่นกัน nullหมายถึงอินสแตนซ์เริ่มต้น:

SELECT SERVERPROPERTY ('InstanceName')

http://technet.microsoft.com/en-us/library/ms174396.aspx


10
SELECT SERVERPROPERTY ('InstanceName') ให้ค่า NULL แก่ฉัน
Steam

4
ใช้ SELECT CONVERT แทน (sysname, SERVERPROPERTY ('servername'));
Stefan Steiger

1
@ Steam: อาจเป็นเพราะเป็นอินสแตนซ์เริ่มต้น
Stefan Steiger

10

SELECT @@servername จะให้ข้อมูลเป็น server/instanceName

หากต้องการรับเฉพาะสิ่งที่instanceNameคุณควรเรียกใช้select @@ServiceNameแบบสอบถาม


ขั้นแรกคุณต้องเฉือนผิดวิธี แบบฟอร์มที่ถูกต้องคือ "เซิร์ฟเวอร์อินสแตนซ์" ประการที่สองไม่เป็นความจริงเสมอไปที่ @@ servername จะให้ทั้งเซิร์ฟเวอร์และอินสแตนซ์แก่คุณเนื่องจากเมื่อมีอินสแตนซ์เพียงอินสแตนซ์เดียวระบบจะส่งคืน "เซิร์ฟเวอร์" เท่านั้น
Robino

9

หยุดแค่ชื่ออินสแตนซ์ทำไม คุณสามารถจัดเก็บสภาพแวดล้อม SQL Server ของคุณได้ดังนี้:

SELECT  
    SERVERPROPERTY('ServerName') AS ServerName,  
    SERVERPROPERTY('MachineName') AS MachineName,
    CASE 
        WHEN  SERVERPROPERTY('InstanceName') IS NULL THEN ''
        ELSE SERVERPROPERTY('InstanceName')
    END AS InstanceName,
    '' as Port, --need to update to strip from Servername. Note: Assumes Registered Server is named with Port
    SUBSTRING ( (SELECT @@VERSION),1, CHARINDEX('-',(SELECT @@VERSION))-1 ) as ProductName,
    SERVERPROPERTY('ProductVersion') AS ProductVersion,  
    SERVERPROPERTY('ProductLevel') AS ProductLevel,
    SERVERPROPERTY('ProductMajorVersion') AS ProductMajorVersion,
    SERVERPROPERTY('ProductMinorVersion') AS ProductMinorVersion,
    SERVERPROPERTY('ProductBuild') AS ProductBuild,
    SERVERPROPERTY('Edition') AS Edition,
    CASE SERVERPROPERTY('EngineEdition')
        WHEN 1 THEN 'PERSONAL'
        WHEN 2 THEN 'STANDARD'
        WHEN 3 THEN 'ENTERPRISE'
        WHEN 4 THEN 'EXPRESS'
        WHEN 5 THEN 'SQL DATABASE'
        WHEN 6 THEN 'SQL DATAWAREHOUSE'
    END AS EngineEdition,  
    CASE SERVERPROPERTY('IsHadrEnabled')
        WHEN 0 THEN 'The Always On Availability Groups feature is disabled'
        WHEN 1 THEN 'The Always On Availability Groups feature is enabled'
        ELSE 'Not applicable'
    END AS HadrEnabled,
    CASE SERVERPROPERTY('HadrManagerStatus')
        WHEN 0 THEN 'Not started, pending communication'
        WHEN 1 THEN 'Started and running'
        WHEN 2 THEN 'Not started and failed'
        ELSE 'Not applicable'
    END AS HadrManagerStatus,
    CASE SERVERPROPERTY('IsSingleUser') WHEN 0 THEN 'No' ELSE 'Yes' END AS InSingleUserMode,
    CASE SERVERPROPERTY('IsClustered')
        WHEN 1 THEN 'Clustered'
        WHEN 0 THEN 'Not Clustered'
        ELSE 'Not applicable'
    END AS IsClustered,
    '' as ServerEnvironment,
    '' as ServerStatus,
    '' as Comments

1
Good Stuff Nate ฉันมีสคริปต์พื้นที่โฆษณาที่ปรับปรุงแล้วที่คล้ายกันซึ่งทำแบบเดียวกัน ติดต่อฉันเพื่อขอสำเนาทางอีเมล ... สคริปต์จะไม่ได้รับความสนใจสำหรับชุดข้อความนี้
แฮงค์ฟรีแมน

8

ฉันพบสิ่งนี้:

EXECUTE xp_regread
        @rootkey = 'HKEY_LOCAL_MACHINE',
        @key = 'SOFTWARE\Microsoft\Microsoft SQL Server',
        @value_name = 'InstalledInstances'

ซึ่งจะให้รายการอินสแตนซ์ทั้งหมดที่ติดตั้งในเซิร์ฟเวอร์ของคุณ


ServerNameทรัพย์สินของSERVERPROPERTYฟังก์ชั่นและ@@SERVERNAMEผลตอบแทนจากข้อมูลที่คล้ายคลึงกัน ServerNameคุณสมบัติให้เซิร์ฟเวอร์และอินสแตนซ์ชื่อ Windows ที่ร่วมกันทำขึ้นเช่นเซิร์ฟเวอร์ที่ไม่ซ้ำกัน @@SERVERNAMEระบุชื่อเซิร์ฟเวอร์ภายในที่กำหนดค่าไว้ในปัจจุบัน

และตัวอย่างของ Microsoft สำหรับเซิร์ฟเวอร์ปัจจุบันคือ:

SELECT CONVERT(sysname, SERVERPROPERTY('servername'));

สถานการณ์นี้มีประโยชน์เมื่อมีการติดตั้ง SQL Server หลายอินสแตนซ์บนเซิร์ฟเวอร์ Windows และไคลเอ็นต์ต้องเปิดการเชื่อมต่ออื่นกับอินสแตนซ์เดียวกับที่ใช้โดยการเชื่อมต่อปัจจุบัน


เลือกแปลง (sysname, SERVERPROPERTY ('servername')); คือคำตอบที่ถูกต้อง
Stefan Steiger

2

ในการรับรายชื่อเซิร์ฟเวอร์และอินสแตนซ์ที่คุณเชื่อมต่อ:

select * from Sys.Servers

ในการรับรายชื่อฐานข้อมูลที่เซิร์ฟเวอร์ที่เชื่อมต่อมี:

SELECT * from sys.databases;

1

เพียงเพื่อเพิ่มคำชี้แจงในแบบสอบถามรีจิสทรี โดยจะแสดงเฉพาะอินสแตนซ์ของบิตเนสที่ตรงกัน (32 หรือ 64) สำหรับอินสแตนซ์ปัจจุบัน

คีย์รีจิสทรีจริงสำหรับอินสแตนซ์ SQL 32 บิตบนระบบปฏิบัติการ 64 บิตคือ:

HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Microsoft SQL Server

คุณสามารถค้นหาสิ่งนี้ในอินสแตนซ์ 64 บิตเพื่อรับอินสแตนซ์ 32 บิตทั้งหมดได้เช่นกัน ดูเหมือนว่าอินสแตนซ์ 32 บิตถูก จำกัด ไว้ที่ Wow6432Node ดังนั้นจึงไม่สามารถอ่านแผนผังรีจิสทรี 64 บิตได้


0

วิธีอื่นในการค้นหาชื่ออินสแตนซ์ - คลิกขวาที่ชื่อฐานข้อมูลและเลือกคุณสมบัติในส่วนนี้คุณสามารถดูคุณสมบัติการเชื่อมต่อที่มุมซ้ายลงคลิกจากนั้นคุณจะเห็นชื่ออินสแตนซ์

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.