Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 DBCC shrinkfile  [new]
pclb
Member

Откуда: Москва
Сообщений: 10
Кто знает, как поместить во временную таблицу результат выполнения dbcc shrinkfile, чтобы потом его программно обработать?
Нужны 2 поля CurrentSize (текущей размер файла в 8К страницах) и EstimatedPages (размер реальных данных в 8К страницах, до которого можно сжать файл). Подойдет и другой программный способ получения этих значений.
22 июн 11, 14:58    [10854784]     Ответить | Цитировать Сообщить модератору
 Re: DBCC shrinkfile  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
Если там один рекордсет, то можно через insert into ... exec ('DBCC ...'). Но их там два, вроде.
В общем и целом, придется так или иначе написать клиентскую прикладуху, которая будет эти рекордсеты получать и обрабатывать.
22 июн 11, 15:01    [10854812]     Ответить | Цитировать Сообщить модератору
 Re: DBCC shrinkfile  [new]
pclb
Member

Откуда: Москва
Сообщений: 10
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 июн 11, 15:11    [10854936]     Ответить | Цитировать Сообщить модератору
 Re: DBCC shrinkfile  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
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 июн 11, 15:14    [10854989]     Ответить | Цитировать Сообщить модератору
 Re: DBCC shrinkfile  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
Не вышел каменный цветок, враги подстраховались. :(

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.
22 июн 11, 15:24    [10855109]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить