2012-01-25 98 views
4

我需要编程确定数据库是否支持Geography数据类型和空间索引。这些功能是在2008年推出的。我还需要确定是否启用CLR,因为这些功能依赖于它。什么是最可靠的方法来做到这一点?如何确定SQL Server 2008或更高版本

回答

5

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

+0

消息8116,级别16,状态1,行1 参数数据类型sql_variant对于parsename函数的参数1无效。 –

+0

@KM:添加CAST – gbn

+0

SERVERPROPERTY('ProductVersion')'显示安装的内容,而不是正在运行的兼容模式。如果以不支持Geography数据类型的旧兼容模式运行,依赖于SERVERPROPERTY('ProductVersion')的软件将失败。 –

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) 
+0

只是在寻找是否有东西,返回更简单的结果是@@ VERSION - 它提供了一个混乱的字符串,如“Microsoft SQL Server的2008 R2(RTM) - 10.50 .1617.0(X64)2011年4月22日十九时23分43秒版权所有(c)Microsoft公司标准版在Windows NT(64位)6.1 (建设7601:Service Pack 1的),我想起了” –

+0

是解析@@版本,但正如乔恩所说,这可能有点混乱,还有更可靠的方法来确定版本吗? –

+0

@Jon Egerton,@@ VERSION并不理想,所以我在兼容模式下加入了检查。它比@@ VERSION更精确。如果数据库是2008年,但在2005年模式下运行,则Geography数据类型将不存在。 –

0

您可以使用SELECT @@VERSION它返回一个相当详细的字符串。

更容易的是看使用

select compatibility_level from sys.databases where name=db_name() 

这将返回一个数字数据库兼容级别。频繁的值,例如:

80 = SQL Server 2000的

90 = SQL Server 2005的

100 = SQL Server 2008的

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

+0

对于新的新版本,要求compatibility_level为100类型? – gbn

+0

我在某处(在几十个博客中的一个上)读到,虽然它可用,但使用少于100个并不是一个好主意。只是一直在寻找该项目(2年后!),不能把我的手放在上面。关卡之间可能存在复制问题,但我认为除此之外还有其他更具体的事情。 –

0

对于波纹管提到的版本,找出使用下面提到的查询

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

enter image description here enter image description here enter image description here enter image description here

相关问题