![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
как выбрать значение из набора записей возвращаемых процедурой [MSSQL]
logslava © (2006-07-14 12:12:00)в SQL SERVERе есть
sp_databases, которая возвращает список баз данных и их размеры
как в запросе выбрать из этого набора нужную строку (допустим нужно узнать размер конкретной БД)?
Stanislav (2006-07-14 16:05:00) [1]sniknik © (14.07.06 15:58) [12]
Т.е. выводит занимаемое место таблицей на диске.
sniknik (2006-07-14 15:58:00) [2]Stanislav © (14.07.06 15:36) [11]
это грубо говоря подсчет страниц на которых располагается таблица, а не размер таблиц.
и таблица в одну строку, и в 100 будет показано одного размера (если не слишком большае запись, в 8кб влазит сумма), а если таблица усиленно используется "размазана" по неполным страницам, то есть вероятность что меньшего размера займет больше страниц... т.е. даже эту "округленную до 8кб" инфу нужно получать только после упаковки (shrink) базы.
Stanislav (2006-07-14 15:36:00) [3]logslava (14.07.06 14:24) [9]
CREATE PROCEDURE GETSIZETABLES AS
DECLARE @pagesizeKB int
SELECT @pagesizeKB = low / 1024 FROM master.dbo.spt_values
WHERE number = 1 AND type = 'E'
SELECT
table_name = OBJECT_NAME(o.id),
rows = i1.rowcnt,
reservedKB = (ISNULL(SUM(i1.reserved), 0) + ISNULL(SUM(i2.reserved), 0)) * @pagesizeKB,
dataKB = (ISNULL(SUM(i1.dpages), 0) + ISNULL(SUM(i2.used), 0)) * @pagesizeKB,
index_sizeKB = ((ISNULL(SUM(i1.used), 0) + ISNULL(SUM(i2.used), 0))
- (ISNULL(SUM(i1.dpages), 0) + ISNULL(SUM(i2.used), 0))) * @pagesizeKB,
unusedKB = ((ISNULL(SUM(i1.reserved), 0) + ISNULL(SUM(i2.reserved), 0))
- (ISNULL(SUM(i1.used), 0) + ISNULL(SUM(i2.used), 0))) * @pagesizeKB
FROM sysobjects o
LEFT OUTER JOIN sysindexes i1 ON i1.id = o.id AND i1.indid < 2
LEFT OUTER JOIN sysindexes i2 ON i2.id = o.id AND i2.indid = 255
WHERE OBJECTPROPERTY(o.id, N'IsUserTable') = 1 --same as: o.xtype = %af_src_str_2
OR (OBJECTPROPERTY(o.id, N'IsView') = 1 AND OBJECTPROPERTY(o.id, N'IsIndexed') = 1)
GROUP BY o.id, i1.rowcnt
ORDER BY 3 DESC
sniknik (2006-07-14 14:45:00) [4]вряд ли... я по крайней мере такого способа не знаю.
logslava (2006-07-14 14:24:00) [5]а можно узнать размеры таблиц базы данных?
sniknik (2006-07-14 14:03:00) [6]> -- это не правильно - ??
неправильно. в переменную табличного типа нельзя... (вроде бы. уточнить бы), придется именно создавать временную (т.е. надо #t/##t а не @t)
logslava (2006-07-14 13:10:00) [7]sniknik © (14.07.06 12:46) [5]
- спасибо, с этим разобрался, только правильнее будет так:
select name from [ТРЕБУЕМАЯ БД].dbo.sysfiles
sniknik © (14.07.06 12:50) [6]
- как с помощью insert'a?
declare @T table (...)
insert into @T
sp_databases -- это не правильно - ??
sniknik (2006-07-14 12:50:00) [8]> ... здесь надо как-то представить результат sp_databases
так не получится, результат процедуры можно только в insert into передать, во временную таблицу к примеру, после из нее выборку сделать, ну или через внешнее чтото (openrowset например) что возвращает рекордсет, но это будет тяжеловесное решение... легче уж весь список передать и нужное на клиенте выбрать.
sniknik (2006-07-14 12:46:00) [9]> допустим нужно узнать размер конкретной БД
select 'КонкретнаяBD' as bd, sum(size)*8 as Size from КонкретнаяBD.dbo.sysfiles
logslava (2006-07-14 12:27:00) [10]да это-то ясно. как написать?
select *
from <?> -- здесь надо как-то представить результат sp_databases
where ...
Desdechado (2006-07-14 12:25:00) [11]WHERE name='нужная бд'
?
logslava (2006-07-14 12:16:00) [12]запрос на сервере (зачем гонят по сети список всех БД)
Desdechado (2006-07-14 12:14:00) [13]На сервере узнать/выбрать или в дельфи?