2011-02-16 21 views
4

原始版本的SQL Server Express具有4GB的固定數據庫大小限制。隨着2008 R2的增加到10GB。我可以執行T-SQL查詢來確定SQL Server Express實例的最大數據大小嗎?

我們的原始代碼執行SELECT SERVERPROPERTY ('edition'),然後查找字符串「Express」以識別快速版。然後我們假設4GB的限制。很明顯,當2008 R2推出時,這種情況已經爆發。我想避免使用「Express」或「Express R2」的存在,然後得出4GB或10GB的限制。如果/當微軟帶出一些具有任意新限制的「R3」版本,這將會失敗。

是否有某種編程方式確定(即通過執行T-SQL查詢)當前大小限制的方法?

+0

如果這樣的事情確實存在,這將是驚人的 - 這將是無論是在產品的更高版本一個毫無意義的功能,或將是一個額外的功能,他們不得不添加到Express,只有很少的價值。我會a)切換到EngineEdition屬性,這樣您就可以擺脫字符串比較,並且b)要麼施加4GB的嚴格限制(您如何使用這些信息?),要麼編寫足夠的代碼以便今天區分pre-SQL2008 R2和SQL2008 R2或更高版本,以及您今天所知的限制。 – 2011-02-16 15:42:28

+1

@Damien_The_Unbeliever - 雖然它沒有使用更先進的版本,我們的應用程序需要用戶自己安裝的本地數據庫(在SQL Server Express的,因爲它是免費的!)。這是一個很好的功能,可以讓他們指出他們的空間不足。 – pete757 2011-02-16 16:37:11

回答

1

如果您超過4GB的SQL Server 2005 Express版本上還原備份時,您將收到此錯誤:

CREATE DATABASE或ALTER DATABASE失敗,因爲 產生的累積數據庫大小會超過您的許可 限制每個數據庫4096 MB。

如果你有在SQL Server 2005 Express Edition的現有數據庫和suddendly增長超過4GB,你會得到這樣的錯誤:

無法爲數據庫「YourDatabaseName」分配一個新的頁面,因爲磁盤空間不足在文件組'YourFilegroup'中。通過刪除文件組中的對象,將其他文件添加到文件組或爲文件組中的現有文件設置自動增長來創建必要的空間。

所以答案是否定的。數據庫大小限制參數在sqlservr.exe中定義。 除非您可以重新編譯原始代碼,否則您無法通過TSQL獲取它。

通過@Kevin羅斯和@Damien_The_Unbeliever建議的啓發:

SELECT 

CASE 

WHEN SERVERPROPERTY ('EngineEdition') = 4 -- 4 = Express Edition 

THEN 

CASE 

WHEN (SELECT max_size FROM sys.database_files WHERE file_id =1)=-1 

THEN 

CASE 

WHEN CONVERT(REAL,CONVERT(VARCHAR(5),SUBSTRING(CONVERT(VARCHAR(5),SERVERPROPERTY('productversion')), 1, CHARINDEX('.', CONVERT(VARCHAR(5),SERVERPROPERTY('productversion')))-1))) < 10.5 -- Not SQL Server R2 

THEN 

'You have got ' 

+ CONVERT(VARCHAR(38), (SELECT 4096-size/128 FROM sys.database_files WHERE file_id =1)) 

+' Mb ' 

+'(' 

+ CONVERT(VARCHAR(38), CONVERT(int, 100*CONVERT(float, (SELECT 4096 - size/128 FROM sys.database_files WHERE file_id =1)) 

/
4096)) 

+ '%) available.' 

+ ' You may increase your database size up to 4Gb.' 

ELSE -- You have got SQL Server R2 

'You have got ' 

+ CONVERT(VARCHAR(38), (SELECT 10240-size/128 FROM sys.database_files WHERE file_id =1)) 

+' Mb' 

+'(' 

+ CONVERT(VARCHAR(38), CONVERT(int, 100*CONVERT(float, (SELECT 10240 - size/128 FROM sys.database_files WHERE file_id =1)) 

/
10240)) 

+ '%) available.' 

+ ' You may increase your database size up to 10Gb.' 

END 

ELSE 

CASE 

WHEN CONVERT(REAL,CONVERT(VARCHAR(5),SUBSTRING(CONVERT(VARCHAR(5),SERVERPROPERTY('productversion')), 1, CHARINDEX('.', CONVERT(VARCHAR(5),SERVERPROPERTY('productversion')))-1))) < 10.5 -- Not SQL Server R2 

THEN 

'You have got ' 

+ CONVERT(VARCHAR(38), (SELECT max_size - size FROM sys.database_files WHERE file_id =1)/128) 

+' Mb left out of ' 

+' Mb (' 

+ CONVERT(VARCHAR(38), CONVERT(int, 100*CONVERT(float, (SELECT max_size - size FROM sys.database_files WHERE file_id =1)) 

/
CONVERT(float,(SELECT max_size FROM sys.database_files WHERE file_id =1)))) 

+ '%).' 

+ ' You may increase your database size up to 4Gb.' 

ELSE -- You have got SQL Server R2 

'You have got ' 

+ CONVERT(VARCHAR(38), (SELECT max_size - size FROM sys.database_files WHERE file_id =1)/128) 

+' Mb left out of ' 

+ CONVERT(VARCHAR(38), (SELECT max_size FROM sys.database_files WHERE file_id =1)/128) 

+' Mb (' 

+ CONVERT(VARCHAR(38), CONVERT(int, 100*CONVERT(float, (SELECT max_size - size FROM sys.database_files WHERE file_id =1)) 

/
CONVERT(float,(SELECT max_size FROM sys.database_files WHERE file_id =1)))) 

+ '%).' 

+ ' You may increase your database size up to 10Gb.' 

END 

END 

ELSE -- Congratulations! You have got something better than Express Edition! 

CASE 

WHEN (SELECT max_size FROM sys.database_files WHERE file_id =1)=-1 

THEN 

'Main file will grow until the disk is full.' 

ELSE 

'You have got ' 

+ CONVERT(VARCHAR(38), (SELECT max_size - size FROM sys.database_files WHERE file_id =1)/128) 

+' Mb left out of ' 

+ CONVERT(VARCHAR(38), (SELECT max_size FROM sys.database_files WHERE file_id =1)/128) 

+' Mb (' 

+ CONVERT(VARCHAR(38), CONVERT(int, 100*CONVERT(float, (SELECT max_size - size FROM sys.database_files WHERE file_id =1)) 

/
CONVERT(float,(SELECT max_size FROM sys.database_files WHERE file_id =1)))) 

+ '%)' 

END 

END 

AS 
Database_Info 

很顯然,我還沒有機會來檢查它的SQL Server 2015-R2上。

+0

你能指點我一篇文章,確認該限制是嵌入在sqlservr.exe中嗎?查看我對這個問題的評論,解釋爲什麼知道大小限制是有用的。 – pete757 2011-02-16 16:40:47

0

我沒有其他任何東西比2008R2快速測試這反對,但會像這樣的工作?

SELECT 
case when SERVERPROPERTY ('EngineEdition')=4 THEN 
    CASE WHEN convert(real,convert(varchar(5),SERVERPROPERTY('productversion'))) <10.5 THEN 
    '4Gb Limit' 
    ELSE '10Gb Limit' end 
    else 'no limit' end as Size_Limit 

這首先檢查它是否是一個快捷版,如果不是則返回「無極限」,如果它是表達它會檢查版本號,如果是小於10.5(前2008R2)然後返回4GB,它是大於或等於10.5,然後它顯示的10Gb

相關問題