gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 09:32:39 24 4
gpt4 key购买 nike

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

我们执行的原始代码 SELECT SERVERPROPERTY ('edition') ,然后查找字符串“Express”以标识快速版本。然后我们假设限制为 4GB。显然,当 2008 R2 出现时,这被打破了。我想避免使用“Express”或“Express R2”的存在来推导出 4GB 或 10GB 的限制。如果/当微软推出带有一些任意新限制的“R3”版本时,这将失败。

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

最佳答案

如果您在 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 上检查它。

关于sql-server - 我可以执行 T-SQL 查询来确定 SQL Server Express 实例的最大数据大小吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5018057/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com