SQL Server Express的原始版本具有4GB的固定数据库大小限制。在2008 R2中,这已增加到10GB。
我们的原始代码执行SELECT SERVERPROPERTY ('edition')
,然后查找字符串“Express”以识别快速版本。然后我们假设限制为4GB。当2008 R2问世时,这显然已经破裂了。我想避免使用“Express”或“Express R2”,然后获得4GB或10GB的限制。如果/当微软推出具有任意新限制的“R3”版本时,这将失败。
是否有某种方法以编程方式确定(即通过执行T-SQL查询)当前大小限制?
答案 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