Добро пожаловать в форум, Guest >> Войти | Регистрация | Поиск | Правила | | В избранное | Подписаться | ||
Все форумы / Microsoft SQL Server |
![]() ![]() |
[-==-] Member Откуда: Сообщений: 194 |
Всем привет! Есть скрипт от Microsoft, который делает реиндекс или ребилд той базы, в контексте которой нахожусь. Решил передалть под sp, чтобы лежела в master'е и передавать ей на вход имя базы, которую надо реиндекснуть. use master go create procedure sp_reindex (@DbName varchar (50)) --хочу передавать в процедуру as begin SET NOCOUNT ON; DECLARE @objectid int; DECLARE @indexid int; DECLARE @partitioncount bigint; DECLARE @schemaname nvarchar(130); DECLARE @objectname nvarchar(130); DECLARE @indexname nvarchar(130); DECLARE @partitionnum bigint; DECLARE @partitions bigint; DECLARE @frag float; DECLARE @command nvarchar(4000); -- Conditionally select tables and indexes from the sys.dm_db_index_physical_stats function -- and convert object and index IDs to names. --set @=DB_ID(@DbName) --declare @DbName nvarchar(50) --для отладки, когда запускать не процедурой, а текстом --select @DbName='TestBase' -- тоже SELECT object_id AS objectid, index_id AS indexid, partition_number AS partitionnum, avg_fragmentation_in_percent AS frag INTO #work_to_do FROM sys.dm_db_index_physical_stats (DB_ID(@DbName), NULL, NULL , NULL, 'LIMITED') WHERE avg_fragmentation_in_percent > 5.0 AND index_id > 0; print @DbName --print @Dbid -- Declare the cursor for the list of partitions to be processed. DECLARE partitions CURSOR FOR SELECT * FROM #work_to_do; -- Open the cursor. OPEN partitions; -- Loop through the partitions. WHILE (1=1) BEGIN; FETCH NEXT FROM partitions INTO @objectid, @indexid, @partitionnum, @frag; IF @@FETCH_STATUS < 0 BREAK; SELECT @objectname = QUOTENAME(o.name), @schemaname = QUOTENAME(s.name) FROM sys.objects AS o JOIN sys.schemas as s ON s.schema_id = o.schema_id WHERE o.object_id = @objectid; SELECT @indexname = QUOTENAME(name) FROM sys.indexes WHERE object_id = @objectid AND index_id = @indexid; SELECT @partitioncount = count (*) FROM sys.partitions WHERE object_id = @objectid AND index_id = @indexid; -- 30 is an arbitrary decision point at which to switch between reorganizing and rebuilding. IF @frag < 30.0 SELECT @command = N'ALTER INDEX ' + @indexname + N' ON ' + @schemaname + N'.' + @objectname + N' REORGANIZE'; IF @frag >= 30.0 SELECT @command = N'ALTER INDEX ' + @indexname + N' ON ' + @schemaname + N'.' + @objectname + N' REBUILD WITH (SORT_IN_TEMPDB = ON, MAXDOP=1)'; IF @partitioncount > 1 SELECT @command = @command + N' PARTITION=' + CAST(@partitionnum AS nvarchar(10)); PRINT N'Executed: ' + @command; --эта штука печатает команду, пока запускаешь текстом, но после первого раза через процедуру перестает печатать и через текст --EXEC (@command); --пока заремлено, нужно хотя бы, чтобы печатала команду END; -- Close and deallocate the cursor. CLOSE partitions; DEALLOCATE partitions; drop table #work_to_do END GO Если этот код выполнять в текстовом в окне запросов EMS, то строка PRINT N'Executed: ' + @command будет печатать строку запроса Потом делаю это все в виде sp в базе master, запускаю ее с передачей ей имени базы, процедура текст не печатает. Причем, DB_ID определяет id базы по имени нормально, но почему-то строка запроса ломается на + @indexname. Если его заремить, то код строки запроса снова будет выводить принтом. Подскажите, что за грабли? Сообщение было отредактировано: 15 ноя 19, 16:39 |
15 ноя 19, 16:37 [22017548] Ответить | Цитировать Сообщить модератору |
TaPaK Member Откуда: Kiev Сообщений: 6801 |
[-==-], а в цикле sys.objects и тд базы мастер вас не смущает? |
15 ноя 19, 16:44 [22017558] Ответить | Цитировать Сообщить модератору |
Yasha123 Member Откуда: Сообщений: 1957 |
надо ее пометить системной и запускать в контексте нужной базы. и убрать параметр |
15 ноя 19, 16:56 [22017581] Ответить | Цитировать Сообщить модератору |
[-==-] Member Откуда: Сообщений: 194 |
TaPaK, Yasha123, да, не хватает контекста именно нужной базы.... Кроме как создавать sp в каждой базе, этот скрипт сложно переделать в универсальный? |
15 ноя 19, 17:14 [22017612] Ответить | Цитировать Сообщить модератору |
msLex Member Откуда: Сообщений: 8730 |
вам же написали
|
||||||||
15 ноя 19, 17:15 [22017613] Ответить | Цитировать Сообщить модератору |
Все форумы / Microsoft SQL Server | ![]() |