วิธีตรวจสอบเวอร์ชันของ SQL Server


127

มีวิธีใดบ้างที่เป็นไปได้ในการกำหนดเวอร์ชันของ SQL Server ที่ปรับใช้

ฉันได้ลองทำโดยใช้ซอฟต์แวร์ SQL Server ฉันต้องการทำโดยใช้คำสั่ง SQL บรรทัดคำสั่ง



คำตอบ:


230

ต่อไปนี้เป็นวิธีที่เป็นไปได้ในการดูเวอร์ชัน:

วิธีที่ 1:เชื่อมต่อกับอินสแตนซ์ของ SQL Server แล้วเรียกใช้แบบสอบถามต่อไปนี้:

Select @@version

ตัวอย่างผลลัพธ์ของแบบสอบถามนี้มีดังนี้:

Microsoft SQL Server 2008 (SP1) - 10.0.2531.0 (X64)   Mar 29 2009 
10:11:52   Copyright (c) 1988-2008 Microsoft Corporation  Express 
Edition (64-bit) on Windows NT 6.1 <X64> (Build 7600: )

วิธีที่ 2:เชื่อมต่อกับเซิร์ฟเวอร์โดยใช้ Object Explorer ใน SQL Server Management Studio หลังจากเชื่อมต่อ Object Explorer แล้วจะแสดงข้อมูลเวอร์ชันในวงเล็บพร้อมกับชื่อผู้ใช้ที่ใช้เพื่อเชื่อมต่อกับอินสแตนซ์เฉพาะของ SQL Server

วิธีที่ 3:ดูสองสามบรรทัดแรกของไฟล์ Errorlog สำหรับอินสแตนซ์นั้น ตามค่าเริ่มต้นบันทึกข้อผิดพลาดจะอยู่ที่ Program Files \ Microsoft SQL Server\MSSQL.n\MSSQL\LOG\ERRORLOGและERRORLOG.nไฟล์ รายการอาจมีลักษณะดังต่อไปนี้:

2011-03-27 22:31:33.50 Server      Microsoft SQL Server 2008 (SP1) - 10.0.2531.0 (X64)                 Mar 29 2009 10:11:52                 Copyright (c) 1988-2008 Microsoft Corporation                Express Edition (64-bit) on Windows NT 6.1 <X64> (Build 7600: )

ดังที่คุณเห็นรายการนี้ให้ข้อมูลที่จำเป็นทั้งหมดเกี่ยวกับผลิตภัณฑ์เช่นเวอร์ชันระดับผลิตภัณฑ์ 64 บิตเทียบกับ 32 บิตรุ่นของ SQL Server และเวอร์ชันของระบบปฏิบัติการที่ SQL Server ทำงานอยู่

วิธีที่ 4:เชื่อมต่อกับอินสแตนซ์ของ SQL Server แล้วเรียกใช้แบบสอบถามต่อไปนี้:

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

หมายเหตุแบบสอบถามนี้ทำงานกับอินสแตนซ์ของ SQL Server 2000 หรือรุ่นที่ใหม่กว่า


7
ฉันพบว่าวิธีที่ 4 มีความน่าเชื่อถือมากกว่าวิธีที่ 1 - ฉันมีเซิร์ฟเวอร์ที่ไม่ได้รับการติดตั้งเซอร์วิสแพ็คอย่างถูกต้องโดยที่วิธีที่ 1 และวิธีที่ 4 ให้ผลลัพธ์ที่แตกต่างกัน แต่วิธีที่ 4 นั้นถูกต้อง
Kaganar

8
declare @sqlVers numeric(4,2)
select @sqlVers = left(cast(serverproperty('productversion') as varchar), 4)

ให้ 8.00, 9.00, 10.00 และ 10.50 สำหรับ SQL 2000, 2005, 2008 และ 2008R2 ตามลำดับ

xp_msverนอกจากนี้ลองขั้นตอนระบบขยาย คุณสามารถเรียกขั้นตอนที่จัดเก็บไว้เช่น

exec master..xp_msver

3

TL; DR

SQLCMD -S (LOCAL) -E -V 16 -Q "IF(ISNULL(CAST(SERVERPROPERTY('ProductMajorVersion') AS INT),0)<11) RAISERROR('You need SQL 2012 or later!',16,1)"
IF ERRORLEVEL 1 GOTO :ExitFail

สิ่งนี้ใช้SQLCMD (มาพร้อมกับ SQL Server) เพื่อเชื่อมต่อกับอินสแตนซ์เซิร์ฟเวอร์ภายในโดยใช้ Windows auth ทำให้เกิดข้อผิดพลาดหากการตรวจสอบเวอร์ชันล้มเหลวและส่งคืน@@ERRORเป็นบรรทัดคำสั่งERRORLEVELถ้า> = 16 (และบรรทัดที่สองไปที่:ExitFailเลเบลหาก ดังกล่าวERRORLEVELคือ> = 1)

Watchas, Gotchas และข้อมูลเพิ่มเติม

สำหรับ SQL 2000+ คุณสามารถใช้SERVERPROPERTYเพื่อกำหนดข้อมูลจำนวนมากได้

ในขณะที่ SQL 2008+ รองรับคุณสมบัติProductMajorVersion& มีมาตั้งแต่ปี 2000 (โปรดจำไว้ว่าถ้าคุณสมบัติไม่ได้รับการสนับสนุนฟังก์ชันจะส่งคืน)ProductMinorVersionProductVersionNULL

หากคุณสนใจในเวอร์ชันก่อนหน้านี้คุณสามารถใช้PARSENAMEฟังก์ชั่นเพื่อแบ่งProductVersion(การจดจำ "ส่วนต่างๆ" จะเรียงลำดับจากขวาไปซ้ายเช่นการPARSENAME('a.b.c', 1)ส่งคืนc)

โปรดจำไว้ว่าPARSENAME('a.b.c', 4)ผลตอบแทนNULLนั้นเนื่องจาก SQL 2005 และก่อนหน้านี้ใช้เพียง 3 ส่วนในหมายเลขเวอร์ชัน!

ดังนั้นสำหรับ SQL 2008+ คุณสามารถใช้:

SELECT
    SERVERPROPERTY('ProductVersion') AS ProductVersion,
    CAST(SERVERPROPERTY('ProductMajorVersion')  AS INT) AS ProductMajorVersion,
    CAST(SERVERPROPERTY ('ProductMinorVersion') AS INT) AS ProductMinorVersion;

สำหรับ SQL 2000-2005 คุณสามารถใช้:

SELECT
    SERVERPROPERTY('ProductVersion') AS ProductVersion,
    CAST(PARSENAME(CAST(SERVERPROPERTY('ProductVersion') AS SYSNAME), CASE WHEN SERVERPROPERTY('ProductVersion') IS NULL THEN 3 ELSE 4 END) AS INT) AS ProductVersion_Major,
    CAST(PARSENAME(CAST(SERVERPROPERTY('ProductVersion') AS SYSNAME), CASE WHEN SERVERPROPERTY('ProductVersion') IS NULL THEN 2 ELSE 3 END) AS INT) AS ProductVersion_Minor,
    CAST(PARSENAME(CAST(SERVERPROPERTY('ProductVersion') AS SYSNAME), CASE WHEN SERVERPROPERTY('ProductVersion') IS NULL THEN 1 ELSE 2 END) AS INT) AS ProductVersion_Revision,
    CAST(PARSENAME(CAST(SERVERPROPERTY('ProductVersion') AS SYSNAME), CASE WHEN SERVERPROPERTY('ProductVersion') IS NULL THEN 0 ELSE 1 END) AS INT) AS ProductVersion_Build;

( PARSENAME(...,0)เป็นการแฮ็คเพื่อปรับปรุงการอ่าน)

ดังนั้นการตรวจสอบเวอร์ชัน SQL 2000+ จะเป็น:

IF (CAST(PARSENAME(CAST(SERVERPROPERTY('ProductVersion') AS SYSNAME), CASE WHEN SERVERPROPERTY('ProductVersion') IS NULL THEN 3 ELSE 4 END) AS INT) < 10) -- SQL2008
OR (
    (CAST(PARSENAME(CAST(SERVERPROPERTY('ProductVersion') AS SYSNAME), CASE WHEN SERVERPROPERTY('ProductVersion') IS NULL THEN 3 ELSE 4 END) AS INT) = 10) -- SQL2008
AND (CAST(PARSENAME(CAST(SERVERPROPERTY('ProductVersion') AS SYSNAME), CASE WHEN SERVERPROPERTY('ProductVersion') IS NULL THEN 2 ELSE 1 END) AS INT) < 5)  -- R2 (this may need to be 50)
   )
    RAISERROR('You need SQL 2008R2 or later!', 16, 1);

สิ่งนี้ง่ายกว่ามากหากคุณสนใจเฉพาะ SQL 2008+ เท่านั้นเนื่องจากSERVERPROPERTY('ProductMajorVersion')ส่งคืนNULLเวอร์ชันก่อนหน้าดังนั้นคุณจึงสามารถใช้:

IF (ISNULL(CAST(SERVERPROPERTY('ProductMajorVersion') AS INT), 0) < 11) -- SQL2012
    RAISERROR('You need SQL 2012 or later!', 16, 1);

และคุณสามารถใช้คุณสมบัติProductLevelและEdition(หรือEngineEdition) เพื่อกำหนด RTM / SP n / CTP nและ Dev / Std / Ent / etc ตามลำดับ

SELECT
    CAST(SERVERPROPERTY('ProductVersion') AS SYSNAME) AS ProductVersion,
    CAST(SERVERPROPERTY('ProductLevel') AS SYSNAME)   AS ProductLevel,
    CAST(SERVERPROPERTY('Edition') AS SYSNAME)        AS Edition,
    CAST(SERVERPROPERTY('EngineEdition') AS INT)      AS EngineEdition;

FYI หมายเลขเวอร์ชันหลักของSQLคือ:

  • 8 = SQL 2000
  • 9 = SQL 2005
  • 10 = SQL 2008 (และ 10.5 = SQL 2008R2)
  • 11 = SQL 2012
  • 12 = SQL 2014
  • 13 = SQL 2016
  • 14 = SQL 2017

และทั้งหมดนี้ใช้ได้กับ SQL Azure ด้วย!

แก้ไข: คุณอาจต้องการตรวจสอบระดับความเข้ากันได้ของฐานข้อมูลเนื่องจากสามารถตั้งค่าความเข้ากันได้ที่ต่ำกว่า

IF EXISTS (SELECT * FROM sys.databases WHERE database_id=DB_ID() AND [compatibility_level] < 110)
    RAISERROR('Database compatibility level must be SQL2008R2 or later (110)!', 16, 1)



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