如何检查 SQLServer 版本

确定已部署 SQLServer 版本的可能方法有哪些?

我试过用 SQLServer 软件来做这件事。我想使用一个命令行 SQL 语句来完成它。

257411 次浏览

以下是查看该版本的可能方法:

方法1: 连接到 SQLServer 实例,然后运行以下查询:

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: 使用 SQLServerManagementStudio 中的对象资源管理器连接到服务器。连接对象资源管理器后,它将以括号显示版本信息,以及用于连接到特定 SQLServer 实例的用户名。

方法3: 查看该实例 Errorlog 文件的前几行。默认情况下,错误日志位于 Program Files MicrosoftSQLServer\MSSQL.n\MSSQL\LOG\ERRORLOGERRORLOG.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: 连接到 SQLServer 实例,然后运行以下查询:

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

注意: 此查询适用于 SQLServer2000或更高版本的任何实例

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

分别给出 SQL 2000、2005、2008和2008R2的8.00、9.00、10.00和10.50。

另外,请尝试使用系统扩展过程 xp_msver

exec master..xp_msver
select charindex(  'Express',@@version)

如果该值为0,则不是快速版

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 连接到本地服务器实例,如果版本检查失败,则抛出错误,如果 > = 16,则返回 @@ERROR作为命令行 ERRORLEVEL(如果前面提到的 ERRORLEVEL > = 1,则第二行转到 :ExitFail标签)。

Watchas,Gotchas & More Info

对于 SQL 2000 + ,您可以使用 服务器财产来确定许多此类信息。

虽然 SQL 2008 + 支持 ProductMajorVersion & ProductMinorVersion属性,但是 ProductVersion从2000年就已经存在了(请记住,如果不支持某个属性,函数将返回 NULL)。

如果您对早期版本感兴趣,您可以使用 PARSENAME函数来分割 ProductVersion(记住“部件”从右到左编号,即 PARSENAME('a.b.c', 1)返回 c)。

还要记住,PARSENAME('a.b.c', 4)返回 NULL,因为 SQL2005和更早的版本号中只使用了3个部分!

因此,对于 SQL 2008 + ,您可以简单地使用:

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

对于 SQL2000-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);

可以使用 ProductLevelEdition(或 EngineEdition)属性分别确定 RTM/SPN/CTPN和 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;

仅供参考,主要的 SQL 版本号是:

  • 8 = SQL2000
  • 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)

Here is what i have done to find the version 下面是我为了找到这个版本所做的工作: 只要编写 SELECT @@version,它就会给你版本。

简单使用

SELECT @@VERSION

样本输出

Microsoft SQL Server 2012 - 11.0.2100.60 (X64)
Feb 10 2012 19:39:15
Copyright (c) Microsoft Corporation
Express Edition (64-bit) on Windows NT 6.2 <X64> (Build 9200: )

资料来源: 如何检查 sql 服务器版本? (解释各种方法)

如果您计划迁移到 Azure,这尤其好

如果你正在搜索兼容性问题,它会给你很多启发:

SELECT
@@servername AS 'Server Name'
,CONNECTIONPROPERTY('local_net_address') AS [IP Address]
,d.name AS [Database_Name]
,d.compatibility_level
,@@version AS 'Version'
,CASE
WHEN CONVERT(VARCHAR(128), SERVERPROPERTY('productversion')) LIKE '8%' THEN 'SQL2000'
WHEN CONVERT(VARCHAR(128), SERVERPROPERTY('productversion')) LIKE '9%' THEN 'SQL2005'
WHEN CONVERT(VARCHAR(128), SERVERPROPERTY('productversion')) LIKE '10.0%' THEN 'SQL2008'
WHEN CONVERT(VARCHAR(128), SERVERPROPERTY('productversion')) LIKE '10.5%' THEN 'SQL2008 R2'
WHEN CONVERT(VARCHAR(128), SERVERPROPERTY('productversion')) LIKE '11%' THEN 'SQL2012'
WHEN CONVERT(VARCHAR(128), SERVERPROPERTY('productversion')) LIKE '12%' THEN 'SQL2014'
WHEN CONVERT(VARCHAR(128), SERVERPROPERTY('productversion')) LIKE '13%' THEN 'SQL2016'
WHEN CONVERT(VARCHAR(128), SERVERPROPERTY('productversion')) LIKE '14%' THEN 'SQL2017'
WHEN CONVERT(VARCHAR(128), SERVERPROPERTY('productversion')) LIKE '15%' THEN 'SQL2019'
ELSE 'unknown'
END AS SQL_Server_Version,
d.collation_name
,(SUM(CAST(mf.size AS BIGINT)) * 8 / 1024) / 1024 AS Size_GBs
FROM sys.master_files mf
INNER JOIN sys.databases d
ON d.database_id = mf.database_id
WHERE d.database_id > 4 -- Skip system databases
GROUP BY d.name
,d.compatibility_level
,d.collation_name
ORDER BY d.name

enter image description here