Mssql: Размер табл в КБ
От: gok Россия  
Дата: 26.10.05 18:26
Оценка:
Есть ли в mssql 2K системная табл, которая хранит размер таблиц для бд? Есть ли другой способ «померить» размер таблицы в килобайтах?
gok
Re: Mssql: Размер табл в КБ
От: ilya_ny  
Дата: 27.10.05 01:24
Оценка: 1 (1)
Здравствуйте, gok, Вы писали:

gok>Есть ли в mssql 2K системная табл, которая хранит размер таблиц для бд? Есть ли другой способ «померить» размер таблицы в килобайтах?


для этого есть процедура sp_spaceused
Re[2]: Mssql: Размер табл в КБ
От: gok Россия  
Дата: 27.10.05 02:07
Оценка:
Здравствуйте, ilya_ny, Вы писали:

_>для этого есть процедура sp_spaceused


Не могу задействовать эту СП в приложении. Хочу что-нибудь вроде:
select [name], data from sp_spaceused('tblName')

выдает ошибку:
Invalid object name 'sp_spaceused'.
gok
Re[3]: Mssql: Размер табл в КБ
От: ilya_ny  
Дата: 27.10.05 02:45
Оценка: 2 (1)
-->>для этого есть процедура 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 here
insert #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
Re[4]: Mssql: Размер табл в КБ
От: gok Россия  
Дата: 27.10.05 04:48
Оценка:
Здравствуйте, ilya_ny, Вы писали:

Пасибки огромные за примеры!!
Те СП возвращает только значения, правильно? Поэтому SELECT не работает:
select * exec sp_spaceused tblLinePoints
gok
Re[5]: Mssql: Размер табл в КБ
От: tpg Россия http://www.sql.ru/
Дата: 27.10.05 05:06
Оценка: +1
Здравствуйте, gok, Вы писали:

gok>Здравствуйте, ilya_ny, Вы писали:


gok>Пасибки огромные за примеры!!

gok>Те СП возвращает только значения, правильно? Поэтому SELECT не работает:
gok>
gok>select * exec sp_spaceused tblLinePoints
gok>


Низззя так писать.... http://www.sql.ru/faq/faq_topic.aspx?fid=416
Re[6]: Mssql: Размер табл в КБ
От: gok Россия  
Дата: 27.10.05 18:03
Оценка:
Здравствуйте, tpg, Вы писали:
tpg>Низззя так писать.... http://www.sql.ru/faq/faq_topic.aspx?fid=416

Постепенно заглатывая руку...
А нельзя ли пропихнуть таблицу в функцию через входные параметры?
Что то вроде:

create function fn_monatak(@input TABLE)
   returns @output TABLE(...)
begin
end
gok
Re[7]: Mssql: Размер табл в КБ
От: tpg Россия http://www.sql.ru/
Дата: 28.10.05 02:32
Оценка: +1
Здравствуйте, gok, Вы писали:

gok>Постепенно заглатывая руку...

gok>А нельзя ли пропихнуть таблицу в функцию через входные параметры?
gok>Что то вроде:

gok>
gok>create function fn_monatak(@input TABLE)
gok>   returns @output TABLE(...)
gok>begin
gok>end
gok>


Нет, нельзя. Вот, что по этому поводу гласит BOL:

CREATE FUNCTION [ owner_name. ] function_name
( [ { @parameter_name [AS] scalar_parameter_data_type [ = default ] } [ ,...n ] ] )

...

scalar_parameter_data_type

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.
Re[4]: Полный путь к табл в mssql, как?
От: gok Россия  
Дата: 29.10.05 01:40
Оценка:
Здравствуйте, 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,
От: ilya_ny  
Дата: 29.10.05 03:18
Оценка: 3 (1)
я слегка переделал вызов к 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 database
        declare @db_current varchar(1000)
    set @db_current = db_name()
    
        -- object database
    declare @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 -- debug
    exec (@sql)
end





PS
кстати, этот же пример показывает, что синтаксическая подсветка sql в rsdn работает хреново
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.