Jak sprawdzić wersję SQL Server

Odpowiedzi:

227

Oto możliwe sposoby wyświetlania wersji:

Metoda 1: Połącz się z wystąpieniem programu SQL Server, a następnie uruchom następującą kwerendę:

Select @@version

Przykład wyniku tego zapytania jest następujący:

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: )

Metoda 2: Połącz się z serwerem za pomocą Eksploratora obiektów w SQL Server Management Studio. Po podłączeniu Object Explorer wyświetli informacje o wersji w nawiasach, wraz z nazwą użytkownika używaną do łączenia się z konkretną instancją SQL Server.

Metoda 3: Spójrz na kilka pierwszych wierszy pliku dziennika błędów dla tego wystąpienia. Domyślnie dziennik błędów znajduje się w lokalizacji Program Files \ Microsoft SQL Server\MSSQL.n\MSSQL\LOG\ERRORLOGand ERRORLOG.nfiles. Wpisy mogą wyglądać następująco:

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: )

Jak widać, ten wpis zawiera wszystkie niezbędne informacje o produkcie, takie jak wersja, poziom produktu, wersja 64-bitowa i 32-bitowa, wydanie programu SQL Server oraz wersja systemu operacyjnego, na którym działa SQL Server.

Metoda 4: Połącz się z wystąpieniem programu SQL Server, a następnie uruchom następującą kwerendę:

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

Uwaga Ta kwerenda działa z każdym wystąpieniem programu SQL Server 2000 lub nowszej wersji

Imran
źródło
6
Zauważyłem, że metoda 4 jest bardziej niezawodna niż metoda 1 - miałem serwery, na których dodatek Service Pack nie został poprawnie zainstalowany, a metoda 1 i metoda 4 zwróciły różne wyniki, ale metoda 4 była poprawna.
Kaganar
8
declare @sqlVers numeric(4,2)
select @sqlVers = left(cast(serverproperty('productversion') as varchar), 4)

Podaje odpowiednio 8,00, 9,00, 10,00 i 10,50 dla SQL 2000, 2005, 2008 i 2008R2.

Wypróbuj również rozszerzoną procedurę systemu xp_msver. Możesz wywołać tę procedurę składowaną, na przykład

exec master..xp_msver
Linga
źródło
2

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

Używa SQLCMD (dostarczanego z SQL Server) do łączenia się z lokalną instancją serwera za pomocą Windows auth, zgłasza błąd, jeśli sprawdzenie wersji się nie powiedzie i zwraca @@ERRORjako wiersz poleceń, ERRORLEVELjeśli> = 16 (a druga linia przechodzi do :ExitFailetykiety, jeśli wspomniany powyżej ERRORLEVELto> = 1).

Watchas, Gotchas i więcej informacji

W przypadku SQL 2000+ możesz użyć parametru SERVERPROPERTY, aby określić wiele z tych informacji.

Chociaż SQL 2008+ obsługuje właściwości ProductMajorVersion& ProductMinorVersion, ProductVersionistnieje od 2000 roku (należy pamiętać, że jeśli właściwość nie jest obsługiwana, funkcja zwraca NULL).

Jeśli jesteś zainteresowany wcześniejszymi wersjami, możesz użyć PARSENAMEfunkcji do podzielenia ProductVersion(pamiętając, że "części" są numerowane od prawej do lewej, czyli PARSENAME('a.b.c', 1)zwroty c).

Pamiętaj też, że PARSENAME('a.b.c', 4)zwraca NULL, ponieważ SQL 2005 i wcześniejsze wersje zawierały tylko 3 części w numerze wersji!

W przypadku SQL 2008+ możesz po prostu użyć:

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

W przypadku SQL 2000-2005 możesz użyć:

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)to trik poprawiający czytelność)

Tak więc sprawdzenie wersji SQL 2000+ wyglądałoby tak:

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);

Jest to o wiele prostsze, jeśli interesuje Cię tylko SQL 2008+, ponieważ SERVERPROPERTY('ProductMajorVersion')zwraca się NULLz wcześniejszymi wersjami, więc możesz użyć:

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

I możesz użyć właściwości ProductLeveli Edition(lub EngineEdition), aby określić odpowiednio RTM / SP n / CTP n i 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, główne numery wersji SQL to:

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

I to wszystko działa również w przypadku SQL Azure!

EDYTOWANE: Możesz również chcieć sprawdzić poziom zgodności z bazą danych, ponieważ może być ustawiony na niższą kompatybilność.

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)
AndrewD
źródło
1

Oto, co zrobiłem, aby znaleźć wersję Oto, co zrobiłem, aby znaleźć wersję: po prostu napisz, SELECT @@versiona otrzymasz wersję.

Imad Ullah
źródło
0
select charindex(  'Express',@@version)

jeśli ta wartość wynosi 0, nie jest to wydanie ekspresowe

R. Alonso
źródło