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

Откуда:
Сообщений: 190
Всем привет!
Есть скрипт от 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]     Ответить | Цитировать Сообщить модератору
 Re: Процедура реиндекса перестает формировать строку команды  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6719
[-==-],

а в цикле sys.objects и тд базы мастер вас не смущает?
15 ноя 19, 16:44    [22017558]     Ответить | Цитировать Сообщить модератору
 Re: Процедура реиндекса перестает формировать строку команды  [new]
Yasha123
Member

Откуда:
Сообщений: 1696
надо ее пометить системной
и запускать в контексте нужной базы.
и убрать параметр
15 ноя 19, 16:56    [22017581]     Ответить | Цитировать Сообщить модератору
 Re: Процедура реиндекса перестает формировать строку команды  [new]
[-==-]
Member

Откуда:
Сообщений: 190
TaPaK, Yasha123, да, не хватает контекста именно нужной базы....
Кроме как создавать sp в каждой базе, этот скрипт сложно переделать в универсальный?
15 ноя 19, 17:14    [22017612]     Ответить | Цитировать Сообщить модератору
 Re: Процедура реиндекса перестает формировать строку команды  [new]
msLex
Member

Откуда:
Сообщений: 7096
|-==-|
роме как создавать sp в каждой базе, этот скрипт сложно переделать в универсальный?

вам же написали
Yasha123
надо ее пометить системной
15 ноя 19, 17:15    [22017613]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить