Здравствуйте, gok, Вы писали:
gok>Есть ли в mssql 2K системная табл, которая хранит размер таблиц для бд? Есть ли другой способ «померить» размер таблицы в килобайтах?
-->>для этого есть процедура sp_spaceused
gok>Не могу задействовать эту СП в приложении. Хочу что-нибудь вроде:
надо так:
sp_spaceused tblName
если надо вернуть данные в таблицу, то
create table #tblSizes(
[name] varchar(50),
[rows] int,
[reserved] varchar(50),
[data] varchar(50),
[index_size] varchar(50),
[unused] varchar(50)
)
insert into #tblSizes([name], [rows], [reserved], [data], [index_size], [unused])
exec sp_spaceused tblName
select * from #tblSizes order by 1 drop table #tblSizes
если несколько таблиц, то можно так :
create table #mainTable(tableName varchar(50))
--ILYA: add a table name hereinsert #mainTable values ('table1')
insert #mainTable values ('table2')
...
insert #mainTable values ('tableN')
create table #tblSizes(
[name] varchar(50),
[rows] int,
[reserved] varchar(50),
[data] varchar(50),
[index_size] varchar(50),
[unused] varchar(50)
)
declare curMainTable scroll cursor for select tableName from #mainTable order by 1
open curMainTable
declare @tableName varchar(50)
while (1 = 1)
begin
fetch next from curMainTable into @tableName
if @@FETCH_STATUS != 0 break
insert into #tblSizes([name], [rows], [reserved], [data], [index_size], [unused])
exec sp_spaceused @tableName
end
close curMainTable
deallocate curMainTable
select * from #tblSizes order by 1 drop table #tblSizes
drop table #mainTable
Здравствуйте, gok, Вы писали:
gok>Здравствуйте, ilya_ny, Вы писали:
gok>Пасибки огромные за примеры!! gok>Те СП возвращает только значения, правильно? Поэтому SELECT не работает: gok>
Здравствуйте, gok, Вы писали:
gok>Постепенно заглатывая руку... gok>А нельзя ли пропихнуть таблицу в функцию через входные параметры? gok>Что то вроде:
gok>
Is the parameter data type. All scalar data types, including bigint and sql_variant, can be used as a parameter for user-defined functions. The timestamp data type and user-defined data types are not supported. Nonscalar types such as cursor and table cannot be specified.
Здравствуйте, ilya_ny, Вы писали:
-->>>для этого есть процедура sp_spaceused
Илья, не подскажешь, пожалуйста, как задать полный путь к таблице?
Пробую замерить размеры разных таблиц из разных бд с помощью exec sp_spaceused @tableName в цикле (см свой пример).
Пробовал задавать ввиде bd1.dbo.tbl1. SELECT работает из любой активной бд. А эта сп ругается:
Server: Msg 15250, Level 16, State 1, Procedure sp_spaceused, Line 56
The database name component of the object qualifier must be the name of the current database.
use db1 в цикле не работает.
gok
Re[5]: dbo.sp_spaceused_ilya ==Полный путь к табл в mssql,
я слегка переделал вызов к sp_spaceused и назвал новую sp sp_spaceused_ilya
создавать ее надо в базе master
я ее протестировал на нескольки примерах — везде она работает
в твоем примере ее надо вызывать так:
sp_spaceused_ilya 'bd1.dbo.tbl1'
вот собственно процедура
use master
go
create procedure dbo.sp_spaceused_ilya(@objname nvarchar(776))
as
begin--current databasedeclare @db_current varchar(1000)
set @db_current = db_name()
-- object databasedeclare @db varchar(1000)
set @db = parsename(@objname, 3)
if @db is null
set @db = db_name()
-- creates declare @sql varchar(1000)
set @sql = '
use {@db}
exec(''sp_spaceused ''''{@objname}'''' '' )
use {@db_current}
'
set @sql = replace(@sql, '{@db}', @db)
set @sql = replace(@sql, '{@objname}', @objname)
set @sql = replace(@sql, '{@db_current}', @db_current)
--print @sql -- debugexec (@sql)
end
PS
кстати, этот же пример показывает, что синтаксическая подсветка sql в rsdn работает хреново