SQL Server Service Broker - обработка хранимых процедур в определенной схеме - PullRequest
0 голосов
/ 18 мая 2018

В настоящее время я работаю над новым проектом, в котором я надеялся динамически автоматизировать выполнение всех хранимых процедур в рамках определенной схемы в базе данных.Я хотел бы иметь возможность просто добавлять хранимые процедуры в конкретную схему (например, Build) и иметь процесс, который выполняется по заданному расписанию, который просто перебирает все хранимые процедуры в схеме и запускает их параллельно.

У нас есть созданная нами пользовательская система ETL, которая позволит нам настраивать несколько заданий, в настоящее время она использует несколько заданий агента, которые выбирают хранимые процедуры и выполняют их.Я надеюсь, что наш новый проект будет использовать что-то лучшее, и подумал, что Service Broker будет решением.

Я исследовал этот продукт: http://partitiondb.com/go-parallel-sql/, который, кажется, обеспечивает некоторые предварительныевстроенный код, который позволит мне ставить в очередь процедуры, однако я не могу извлечь базу данных, которую они предоставляют, по-видимому, она имеет поврежденный заголовок: - (

Я новичок в мире сервис-брокеров, иУ меня возникли небольшие трудности в определении того, как я могу автоматически получить что-то, чтобы поставить в очередь кучу хранимых процедур, которые выполняются параллельно.

Любая помощь будет высоко ценится.

Приветствия

1 Ответ

0 голосов
/ 18 мая 2018

Перефразируя одного из моих любимых поэтов - "mo 'tech, mo' problem". Компонент Service Broker - это отличное решение для асинхронной обработки, но здесь оно не совсем подходит. В частности, если все, что вам нужно - это запустить (возможно, неизвестный) набор хранимых процедур по расписанию, динамический SQL кажется мне более подходящим. Что-то вроде (не проверено)

create or alter procedure dbo.gottaRunEmAll
as
begin
    declare p cursor fast_forward, local for
    select name
    from sys.objects
    where schema_id = schema_id('Build');

    open p;

    declare @name sysname, @sql nvarchar(max);

    while(1=1)
    begin
        fetch next from p into @name;
        if (@@rowcount <> 0)
            break;
        set @sql = concat('exec [Build].', quotename(name), ';');
        exec(@sql)
    end
    close p
    deallocate p
end

Лучше (imo) было бы поддерживать вышеуказанную процедуру в явном виде для вызова процедур, которые вы хотите и как вы хотите их.

...