2017-09-26 86 views
1

我想编写一个查询到在我的多个SQL版本是SQL 2008 R2,SQL 2012,SQL 2014年,2016年SQL为SQL 2008 R2使用sys.dm_os_sys_info及以上

由于收集内存统计在sys.dm_os_sys_info列名称的变化,我试图绕过这一点,但无论是查询失败:

消息207,级别16,状态1,行7 无效的列名称physical_memory_kb“。

有什么建议吗?

IF (LEFT(cast(serverproperty('productVersion') as varchar(100)),2) = '10') 
BEGIN 
    select physical_memory_in_bytes/1048576 FROM sys.dm_os_sys_info 
END 
ELSE 
BEGIN 
    select physical_memory_kb/1024 FROM sys.dm_os_sys_info 
END 

select 
    CASE LEFT(cast(serverproperty('productVersion') as varchar(100)),2) 
    WHEN 10 Then physical_memory_in_bytes/1048576 
    ELSE physical_memory_kb/1024 
    END 
FROM sys.dm_os_sys_info 

回答

1

你得到的错误是编译错误,即语法分析器试图找出现有的表/视图的列,它不考虑执行流程(IF)

您可以使用此代码对你的目的:

IF (LEFT(cast(serverproperty('productVersion') as varchar(100)),2) = '10') 
BEGIN 
    exec('select physical_memory_in_bytes/1048576 FROM sys.dm_os_sys_info') 
END 
ELSE 
BEGIN 
    exec ('select physical_memory_kb/1024 FROM sys.dm_os_sys_info') 
END 
0

你不能把一个条件语句从子虚乌有列这样的选择,编译器仍然会验证SELECT子句中的所有语句。

第一个有条件作品,因为它是两个不同的选择语句。

我会建议使用第一个条件唯一,如果您需要额外的信息,然后选择physical_memory_in ...列到临时表或表变量,然后将其加入到您的主查询。

相关问题