DBCC shrinkfile

pclb
Дата: 22.06.2011 14:58:51
Кто знает, как поместить во временную таблицу результат выполнения dbcc shrinkfile, чтобы потом его программно обработать?
Нужны 2 поля CurrentSize (текущей размер файла в 8К страницах) и EstimatedPages (размер реальных данных в 8К страницах, до которого можно сжать файл). Подойдет и другой программный способ получения этих значений.
Гавриленко Сергей Алексеевич
Дата: 22.06.2011 15:01:17
Если там один рекордсет, то можно через insert into ... exec ('DBCC ...'). Но их там два, вроде.
В общем и целом, придется так или иначе написать клиентскую прикладуху, которая будет эти рекордсеты получать и обрабатывать.
pclb
Дата: 22.06.2011 15:11:13
create table #t ([DbId] int, FileId int, CurrentSize bigint, MinimumSize bigint, UsedPages bigint, EstimatedPages
bigint)

insert into #t ([DbId], FileId, CurrentSize, MinimumSize, UsedPages, EstimatedPages)
exec ('DBCC SHRINKFILE (''Data'', 30000)')

select * from #t
drop table #t


выдалась ошибка:
Msg 8920, Level 16, State 2, Line 1
Cannot perform a shrinkfile operation inside a user transaction. Terminate the transaction and reissue the statement.

(0 row(s) affected)

(0 row(s) affected)


Что делать?
Гавриленко Сергей Алексеевич
Дата: 22.06.2011 15:14:53
pclb
Cannot perform a shrinkfile operation inside a user transaction. Terminate the transaction and reissue the statement.
А, вот оно чего. ;)

pclb
Что делать?
Либо писать прикладуху, либо парсить output какой-нибудь другой, которая вызовет это команду. Зависит от многого кол-ва факторов. Варианты - от xp_cmdshell + sqlcmd, до clr-сборки.

Btw, а зачем оно вам. Какая-то подозрительная автоматизация зачастую ненужной команды.
Гавриленко Сергей Алексеевич
Дата: 22.06.2011 15:24:18
Не вышел каменный цветок, враги подстраховались. :(

if object_id('tempdb..#test_shrinkfile') is null
	exec('create procedure #test_shrinkfile as ')
GO
alter procedure #test_shrinkfile
as begin
	set nocount on

	set quoted_identifier, ansi_nulls, ansi_warnings, arithabort,
	  concat_null_yields_null, ansi_padding on
	set numeric_roundabort off

    declare
        @trancount  int     = @@trancount
        
    if @trancount > 0
        rollback
                
    dbcc shrinkfile(1)
    
    while @@trancount < @trancount
        begin tran
end
go
if object_id('tempdb..#t') is not null
    drop table #t
    
create table #t(
    DbId	            int
    , FileId	        int
    , CurrentSize	    int
    , MinimumSize	    int
    , UsedPages	        int
    , EstimatedPages    int
)    
insert #t exec #test_shrinkfile
go
-------------------------------------------------------------------
Msg 3915, Level 16, State 0, Procedure #test_shrinkfile________________________________________________________________________________________________________0000AF5E, Line 13
Cannot use the ROLLBACK statement within an INSERT-EXEC statement.