Можно ли выполнить запрос T-SQL, чтобы определить максимальный размер данных для экземпляра SQL Server Express? - PullRequest
4 голосов
/ 16 февраля 2011

Исходная версия SQL Server Express имела фиксированный предел размера базы данных 4 ГБ. С 2008 R2 это увеличилось до 10GB.

Наш оригинальный код выполнил SELECT SERVERPROPERTY ('edition'), затем искал строку «Экспресс» для идентификации экспресс-издания. Затем мы приняли предел 4 ГБ. Очевидно, что это сломалось, когда 2008 R2 вышел. Я хочу избежать использования «Express» или «Express R2», чтобы затем получить ограничение 4 ГБ или 10 ГБ. Это потерпит неудачу, если / когда Microsoft выпустит версию «R3» с произвольным новым пределом.

Есть ли какой-либо способ программно определить (т.е. выполнить запрос T-SQL) ограничение на текущий размер?

Ответы [ 2 ]

1 голос
/ 16 февраля 2011

Если вы восстанавливаете резервную копию размером более 4 ГБ в SQL Server 2005 Express Edition, вы получите эту ошибку:

Ошибка CREATE DATABASE или ALTER DATABASE, потому что результирующий совокупный размер базы данных превысит ваш лицензионный лимит в 4096МБ на базу данных.

В случае, если у вас есть существующая база данных в SQL Server 2005 Express Edition, и размер ее неожиданно превысит 4 ГБ, вы получите эту ошибку:

Не удалось выделить новую страницу для базы данных «YourDatabaseName», посколькунедостаточно места на диске в файловой группе 'YourFilegroup'.Создайте необходимое пространство, отбросив объекты в файловой группе, добавив дополнительные файлы в файловую группу или установив автоматический рост для существующих файлов в файловой группе.

Таким образом, ответ НЕТ.Параметр ограничения размера базы данных определен в 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.

0 голосов
/ 17 февраля 2011

У меня нет ничего, кроме 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), затем возвращает 4 Гб , это больше или равно 10,5, то отображается 10Gb

...