2017-09-26 26 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 ...列到臨時表或表變量,然後將其加入到您的主查詢。

相關問題