我可以执行T-SQL查询来确定SQL Server Express实例的最大数据大小吗?

时间:2011-02-16 15:02:55

标签: sql-server tsql sql-server-express

SQL Server Express的原始版本具有4GB的固定数据库大小限制。在2008 R2中,这已增加到10GB。

我们的原始代码执行SELECT SERVERPROPERTY ('edition'),然后查找字符串“Express”以识别快速版本。然后我们假设限制为4GB。当2008 R2问世时,这显然已经破裂了。我想避免使用“Express”或“Express R2”,然后获得4GB或10GB的限制。如果/当微软推出具有任意新限制的“R3”版本时,这将失败。

是否有某种方法以编程方式确定(即通过执行T-SQL查询)当前大小限制?

2 个答案:

答案 0 :(得分:1)

如果要在SQL Server 2005 Express Edition上还原大于4GB的备份,则会出现此错误:

CREATE DATABASE或ALTER DATABASE失败,因为 结果累积数据库大小将超过您的许可 每个数据库的限制为4096 MB。

如果您在SQL Server 2005 Express Edition中拥有现有数据库并且突然增长超过4GB,您将收到此错误:

由于文件组“YourFilegroup”中的磁盘空间不足,无法为数据库“YourDatabaseName”分配新页面。通过删除文件组中的对象,向文件组添加其他文件,或为文件组中的现有文件设置自动增长来创建必要的空间。

所以答案是否定的。数据库大小限制参数在sqlservr.exe中定义。 除非您可以重新编译原始代码,否则无法通过TSQL获取它。

灵感来自@Kevin Ross和@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 2005-2008-R2上检查它。

答案 1 :(得分:0)

除了2008R2 Express之外,我没有其他任何东西可以对此进行测试,但这会有什么用?

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