powered by simpleCommunicator - 2.0.59     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Процедура реиндекса перестает формировать строку команды
5 сообщений из 5, страница 1 из 1
Процедура реиндекса перестает формировать строку команды
    #39889813
[-==-]
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем привет!
Есть скрипт от Microsoft, который делает реиндекс или ребилд той базы, в контексте которой нахожусь. Решил передалть под sp, чтобы лежела в master'е и передавать ей на вход имя базы, которую надо реиндекснуть.
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
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.
Если его заремить, то код строки запроса снова будет выводить принтом.
Подскажите, что за грабли?
...
Рейтинг: 0 / 0
Процедура реиндекса перестает формировать строку команды
    #39889821
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
[-==-],

а в цикле sys.objects и тд базы мастер вас не смущает?
...
Рейтинг: 0 / 0
Процедура реиндекса перестает формировать строку команды
    #39889838
Фотография Yasha123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
надо ее пометить системной
и запускать в контексте нужной базы.
и убрать параметр
...
Рейтинг: 0 / 0
Процедура реиндекса перестает формировать строку команды
    #39889856
[-==-]
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
TaPaK, Yasha123, да, не хватает контекста именно нужной базы....
Кроме как создавать sp в каждой базе, этот скрипт сложно переделать в универсальный?
...
Рейтинг: 0 / 0
Процедура реиндекса перестает формировать строку команды
    #39889857
msLex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
|-==-|
роме как создавать sp в каждой базе, этот скрипт сложно переделать в универсальный?

вам же написали
Yasha123
надо ее пометить системной
...
Рейтинг: 0 / 0
5 сообщений из 5, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Процедура реиндекса перестает формировать строку команды
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]