【问题标题】:How to check SQL Server version如何检查 SQL Server 版本
【发布时间】:2013-12-19 12:59:05
【问题描述】:

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

我已尝试使用 SQL Server 软件来完成。我想使用命令行 SQL 语句来完成。

【问题讨论】:

标签: sql-server-2008 version


【解决方案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: 使用 SQL Server Management Studio 中的对象资源管理器连接到服务器。对象资源管理器连接后,会在括号中显示版本信息,以及用于连接特定 SQL Server 实例的用户名。

方法 3:查看该实例的错误日志文件的前几行。默认情况下,错误日志位于 Program Files\Microsoft SQL Server\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 的操作系统版本.

方法四:连接到SQL Server实例,然后运行如下查询:

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

注意此查询适用于 SQL Server 2000 或更高版本的任何实例

【讨论】:

  • 我发现方法 4 比方法 1 更可靠——我的服务器没有正确安装服务包,其中方法 1 和方法 4 返回不同的结果,但是方法4 是正确的。
【解决方案2】:
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

【讨论】:

    【解决方案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 身份验证连接到本地服务器实例,如果版本检查失败则抛出错误,并返回 @@ERROR 作为命令行 ERRORLEVEL if >= 16 (如果上述ERRORLEVEL >= 1,则第二行转到:ExitFail 标签)。

    手表、陷阱及更多信息

    对于 SQL 2000+,您可以使用 SERVERPROPERTY 来确定很多此类信息。

    虽然 SQL 2008+ 支持 ProductMajorVersionProductMinorVersion 属性,但 ProductVersion 自 2000 年以来一直存在(请记住,如果不支持属性,则函数返回 NULL)。

    如果您对早期版本感兴趣,可以使用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);
    

    您可以使用ProductLevelEdition(或EngineEdition)属性来确定RTM/SPn/CTPn和Dev/Std/ Ent / 等。

    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 version numbers 是:

    • 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!

    已编辑: 您可能还想检查您的DB compatibility level,因为它可能被设置为较低的兼容性。

    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)
    

    【讨论】:

      【解决方案4】:

      简单使用

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

      来源:How to check sql server version? (Various ways explained)

      【讨论】:

        【解决方案5】:

        这是我为找到版本所做的工作: 只要写SELECT @@version,它就会给你版本。

        【讨论】:

          【解决方案6】:

          如果您计划迁移到 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
          

          【讨论】:

            【解决方案7】:
            select charindex(  'Express',@@version)
            

            如果这个值为0不是特快版

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2020-06-27
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多