Quels sont les moyens possibles pour déterminer la version de SQL Server déployée?
J'ai essayé de le faire en utilisant le logiciel SQL Server. Je veux le faire en utilisant une instruction SQL en ligne de commande.
Voici des façons possibles de voir la version:
Méthode 1: Connectez-vous à l'instance de SQL Server, puis exécutez la requête suivante:
Select @@version
Voici un exemple de résultat de cette requête:
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: )
Méthode 2: Connectez-vous au serveur à l'aide de l'Explorateur d'objets de SQL Server Management Studio. Une fois l’Explorateur connecté, il affiche les informations de version entre parenthèses, ainsi que le nom d’utilisateur utilisé pour se connecter à l’instance spécifique de SQL Server.
Méthode 3: Regardez les premières lignes du fichier Errorlog pour cette instance. Par défaut, le journal des erreurs se trouve dans les fichiers Program Files\Microsoft SQL Server\MSSQL.n\MSSQL\LOG\ERRORLOG
et ERRORLOG.n
. Les entrées peuvent ressembler à ceci:
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: )
Comme vous pouvez le constater, cette entrée fournit toutes les informations nécessaires sur le produit, telles que sa version, son niveau, la version 64 bits ou 32 bits, l'édition de SQL Server et la version du système d'exploitation sur laquelle SQL Server s'exécute.
Méthode 4: Connectez-vous à l'instance de SQL Server, puis exécutez la requête suivante:
SELECT SERVERPROPERTY('productversion'), SERVERPROPERTY ('productlevel'), SERVERPROPERTY ('edition')
Remarque Cette requête fonctionne avec n'importe quelle instance de SQL Server 2000 ou d'une version ultérieure
declare @sqlVers numeric(4,2)
select @sqlVers = left(cast(serverproperty('productversion') as varchar), 4)
Donne 8,00, 9,00, 10,00 et 10,50 pour SQL 2000, 2005, 2008 et 2008R2 respectivement.
Essayez également la procédure étendue du système xp_msver
. Vous pouvez appeler cette procédure stockée comme
exec master..xp_msver
select charindex( 'Express',@@version)
si cette valeur est 0 n'est pas une édition express
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
Ceci utilise SQLCMD (fourni avec SQL Server) pour se connecter à l'instance de serveur local à l'aide de Windows auth, génère une erreur en cas d'échec de la vérification de version et renvoie le @@ERROR
sous la ligne de commande ERRORLEVEL
si> = 16 ( et la deuxième ligne passe à l'étiquette :ExitFail
si la ERRORLEVEL
susmentionnée est> = 1).
Watchas, Gotchas & More Info
Pour SQL 2000+, vous pouvez utiliser le SERVERPROPERTY pour déterminer un grand nombre de ces informations.
Bien que SQL 2008+ prenne en charge les propriétés ProductMajorVersion
& ProductMinorVersion
, ProductVersion
existe depuis 2000 (en se rappelant que si une propriété n'est pas prise en charge, la fonction renvoie NULL
).
Si les versions précédentes vous intéressent, vous pouvez utiliser la fonction PARSENAME
pour scinder la ProductVersion
(les "parties" sont numérotées de droite à gauche, c.-à-d. PARSENAME('a.b.c', 1)
renvoie c
).
N'oubliez pas non plus que PARSENAME('a.b.c', 4)
renvoie NULL
, car SQL 2005 et versions antérieures utilisaient uniquement 3 composants dans le numéro de version!
Donc, pour SQL 2008+, vous pouvez simplement utiliser:
SELECT
SERVERPROPERTY('ProductVersion') AS ProductVersion,
CAST(SERVERPROPERTY('ProductMajorVersion') AS INT) AS ProductMajorVersion,
CAST(SERVERPROPERTY ('ProductMinorVersion') AS INT) AS ProductMinorVersion;
Pour SQL 2000-2005, vous pouvez utiliser:
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;
(la PARSENAME(...,0)
est un hack pour améliorer la lisibilité)
Donc, une vérification pour une version SQL 2000+ serait:
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);
Ceci est beaucoup plus simple si vous ne vous intéressez qu'à SQL 2008+ car SERVERPROPERTY('ProductMajorVersion')
renvoie NULL
pour les versions antérieures. Vous pouvez donc utiliser:
IF (ISNULL(CAST(SERVERPROPERTY('ProductMajorVersion') AS INT), 0) < 11) -- SQL2012
RAISERROR('You need SQL 2012 or later!', 16, 1);
Et vous pouvez utiliser les propriétés ProductLevel
et Edition
(ou EngineEdition
) pour déterminer RTM/SPn/CTPn et Dev/Std/Ent/etc. respectivement.
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;
Pour info, les principaux numéros de version SQL sont les suivants:
Et tout cela fonctionne aussi pour SQL Azure!
EDITED: Vous pouvez également vouloir vérifier votre niveau de compatibilité de la base de données car il pourrait être réglé sur une compatibilité plus faible.
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)