Sql server 如何确定SQL Server 2008或更高版本

Sql server 如何确定SQL Server 2008或更高版本,sql-server,clr,geography,version-detection,Sql Server,Clr,Geography,Version Detection,我需要通过编程确定数据库是否支持地理数据类型和空间索引。这些功能于2008年推出。我还需要确定是否启用了CLR,因为这些功能依赖于它。最可靠的方法是什么?分析以下内容: select @@VERSION SELECT * FROM sys.configurations WHERE name = 'clr enabled' SELECT compatibility_level from sys.databases where name=db_name() 比如: 输出: OnSQLServe

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

分析以下内容:

select @@VERSION

SELECT * FROM sys.configurations WHERE name = 'clr enabled'

SELECT compatibility_level from sys.databases where name=db_name()
比如:

输出:

OnSQLServer2008 clr_enabled SQLServer2008CompatibilityMode
--------------- ----------- ------------------------------
Yes             No          No

(1 row(s) affected)

SQLServer2008是10.x

您可以在SQL和查询中使用


编辑:添加了CAST

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

更简单的方法是使用

select compatibility_level from sys.databases where name=db_name()
这将返回一个数字。常见值包括:

80=SQL Server 2000

90=SQL Server 2005

100=SQL Server 2008


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

使用下面提到的查询

SELECT
SERVERPROPERTY('ProductVersion') AS ProductVersion,
SERVERPROPERTY('ProductLevel') AS ProductLevel,
SERVERPROPERTY('Edition') AS Edition,
SERVERPROPERTY('EngineEdition') AS EngineEdition;
对于下面提到的版本,请查看


只是想看看是否有什么东西返回了一个更简单的结果@@VERSION-它给出了一个混乱的字符串,例如“Microsoft SQL Server 2008 R2(RTM)-10.50.1617.0(X64)2011年4月22日19:23:43版权所有(c)Windows NT 6.1上的Microsoft Corporation Standard Edition(64位)(Build 7601:Service Pack 1)”是解析@我想到的版本,但正如Jon所说,这可能有点混乱。是否有更可靠的方法来确定版本?@Jon Egerton,@@version不理想,所以我添加了兼容性模式检查。它比@VERSION更准确。若数据库为2008,但在2005模式下运行,则地理数据类型将不存在。升级到SQL 2012时会发生什么情况?如果您只是查找
==2008
,代码将中断,我很确定升级顾问不会警告您。@m\m,这只是一个简单的示例,您可以始终在兼容性级别上使用
=100
键入逻辑。Msg 8116,级别16,状态1,第1行参数数据类型sql_variant对于parsename函数的参数1无效。
SERVERPROPERTY('ProductVersion')
显示已安装的内容,而不是正在运行的兼容模式。如果在不支持地理数据类型的旧兼容模式下运行,依赖于
SERVERPROPERTY('ProductVersion')
的软件将失败。@JackAllan:我无法测试,但msdn说“此选项当前有效的运行值”对于新类型,兼容性级别是否需要为100?我在哪里读到过(在几十个博客中的一个)虽然它是可用的,但使用少于100不是一个好主意。只是一直在寻找这个项目(2年后!!),我无法把手放在它上面。级别之间可能存在复制问题,但我认为还有其他更具体的事情。
select compatibility_level from sys.databases where name=db_name()
SELECT
SERVERPROPERTY('ProductVersion') AS ProductVersion,
SERVERPROPERTY('ProductLevel') AS ProductLevel,
SERVERPROPERTY('Edition') AS Edition,
SERVERPROPERTY('EngineEdition') AS EngineEdition;