【问题标题】:How to determine SQL Server 2008 or above如何确定 SQL Server 2008 或更高版本
【发布时间】:2012-01-25 16:40:51
【问题描述】:

我需要以编程方式确定数据库是否支持地理数据类型和空间索引。这些功能是在 2008 年引入的。我还需要确定是否启用了 CLR,因为这些功能依赖于它。最可靠的方法是什么?

【问题讨论】:

    标签: sql-server clr geography version-detection


    【解决方案1】:

    SQL Server 2008 是 10.x

    可以在SQL中使用SERVERPROPERTY查询sys.configurations

    SELECT
       PARSENAME(CAST(SERVERPROPERTY('ProductVersion') AS varchar(20)), 3) AS MajorVersion, 
       value_in_use
    FROM 
       sys.configurations
    WHERE
       name = 'clr enabled';
    

    编辑:添加 CAST

    【讨论】:

    • Msg 8116, Level 16, State 1, Line 1 参数数据类型 sql_variant 对 parsename 函数的参数 1 无效。
    • SERVERPROPERTY('ProductVersion') 显示已安装的内容,而不是正在运行的兼容模式。如果在不支持 Geography 数据类型的旧兼容模式下运行,依赖于 SERVERPROPERTY('ProductVersion') 的软件将失败。
    • @JackAllan:我无法对此进行测试,但 msdn 说“运行值当前对此选项有效”
    【解决方案2】:

    解析以下内容:

    select @@VERSION
    
    SELECT * FROM sys.configurations WHERE name = 'clr enabled'
    
    SELECT compatibility_level from sys.databases where name=db_name()
    

    喜欢:

    select
        CASE 
            WHEN LEFT(@@VERSION,25)='Microsoft SQL Server 2008' THEN 'Yes' 
            ELSE 'NO' 
        END AS OnSQLServer2008
        ,CASE value
             WHEN 0 THEN 'No'
             ELSE 'Yes'
         END AS [clr_enabled]
        ,(SELECT CASE compatibility_level WHEN 100 then 'Yes' ELSE 'No' END from sys.databases where name=db_name()) AS SQLServer2008CompatibilityMode
        FROM sys.configurations 
        WHERE name = 'clr enabled'
    

    输出:

    OnSQLServer2008 clr_enabled SQLServer2008CompatibilityMode
    --------------- ----------- ------------------------------
    Yes             No          No
    
    (1 row(s) affected)
    

    【讨论】:

    • 只是在查看是否有一些东西可以返回比@@VERSION 更简单的结果 - 它给出了一个混乱的字符串,例如“Microsoft SQL Server 2008 R2 (RTM) - 10.50.1617.0 (X64) Apr 22 2011 19:23:43 版权所有 (c) Microsoft Corporation Standard Edition (64-bit) o​​n Windows NT 6.1 (Build 7601: Service Pack 1)"
    • 是的,我想到了解析@@version,但正如 Jon 所说,这可能有点混乱,有没有更可靠的方法来确定版本?
    • @Jon Egerton,@@VERSION 不太理想,所以我在兼容模式检查中添加了。它比@@VERSION 更准确。如果数据库是 2008,但在 2005 模式下运行,则地理数据类型将不存在。
    • 升级到 SQL 2012 时会发生什么?如果您只查找==2008,代码将会中断,我很确定升级顾问不会警告您。
    • @M_M,这只是一个简单的例子,你总是可以在兼容性级别上使用>= 100类型逻辑。
    【解决方案3】:

    您可以使用SELECT @@VERSION,它会返回一个相当冗长的字符串。

    使用

    更容易查看数据库兼容性级别
    select compatibility_level from sys.databases where name=db_name()
    

    这将返回一个数字。常用值如:

    80 = SQL Server 2000

    90 = SQL Server 2005

    100 = SQL Server 2008

    这具有检查服务器上的数据库是否处于所需级别的额外好处,而不仅仅是服务器本身运行特定系统版本。

    【讨论】:

    • 对于新类型,compatibility_level 是否必须为 100?
    • 我在某处(在几十个博客中的一个上)读到,虽然它可用,但使用少于 100 个并不是一个好主意。只是一直在寻找该项目(2 年后!!),不能把手放在上面。级别之间可能存在复制问题,但我认为还有其他更具体的事情。
    【解决方案4】:

    使用下面提到的查询

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

    下面提到的版本来查找。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多