Это действительно зависит от того, что делает procInEachDb. Я могу понять пример использования, когда у вас есть один и тот же код в каждой базе данных, который нужно выполнять независимо, потому что он опирается на объекты локальной области, манипулирует данными, переносит данные в другие места и т. Д. В нескольких базах данных можно сделать не так много из одной операции, особенно если набор баз данных является динамическим (возможно, со статическим набором, вы можете записывать UNION для разных баз данных и т. д., но вы все равно не можете писать). Но я бы действительно постарался понять от клиента, что делает процедура и почему она так нарушена. Вполне возможно, что это лучший способ сделать то, что нужно клиенту, и в этом случае нет никакого неприятного запаха, за исключением того, что, возможно, он мог бы использовать лучшую обработку ошибок. =) * * Тысяча одна
Я управляю одной системой, в которой у нас есть более 500 примерно одинаковых баз данных в экземпляре, и нам нужно запускать один и тот же набор регулярно запланированных задач в каждой. Я не хочу создавать 500 заданий агента и не хочу создавать задание с 500 шагами, поэтому вместо этого я создал хранимую процедуру с некоторыми настройками, которая ведет себя как sp_MSForEachDB (которая по сути совпадает с кодом, который вы показываете). выше). Я повторно использую эту же процедуру для многих команд, которые я хочу выполнить для всех баз данных. Процедура также принимает аргументы, которые допускают исключения и т. Д.
Да, я мог бы сделать нечто подобное с сервисным брокером, но я обнаружил, что для некоторых вещей мне нужно больше наглядности и контроля над тем, что на самом деле происходит. И, конечно, выполнять ручные одноразовые операции легко с помощью таких инструментов, как SQL Farms Combine или Red-Gate с несколькими сценариями.