Хотя лучшим решением этого конкретного вопроса о предоставлении выполнения всем процедурам является тот, который предоставляется marc_s , на самом деле вопрос заключается в том, существует ли способ создать одну хранимую процедуру и сделать ее доступной для всехбазы данных.
Способ сделать это задокументирован в https://nickstips.wordpress.com/2010/10/18/sql-making-a-stored-procedure-available-to-all-databases/:
- Создать хранимую процедуру в базе данных
master
. - Имя должно бытьначать с
sp_
, например sp_MyCustomProcedure
- Выполнить
sys.sp_MS_marksystemobject
с передачей имени процедуры, например EXEC sys.sp_MS_marksystemobject sp_MyCustomProcedure
Вот простой пример, который просто выбирает имятекущей базы данных:
use master
go
create procedure dbo.sp_SelectCurrentDatabaseName as begin
select db_name()
end
go
execute sys.sp_MS_marksystemobject sp_SelectCurrentDatabaseName
go
В этом случае будет работать exec dbo.sp_SelectCurrentDatabaseName
для любой базы данных.
Чтобы пометить процедуру как не системный объект, в * 1027 предложено несколько неприятных хаков*https://social.msdn.microsoft.com/Forums/sqlserver/en-US/793d0add-6fd9-43ea-88aa-c0b3b89b8d70/how-do-i-undo-spmsmarksystemobject?forum=sqltools, но это самый безопасный и простой способ - просто удалить и заново создать процедуру.
Предостережение
Конечно, создание системных процедур, подобных этой, нарушает общие правила.правило не называть свой собственный процессdures как sp_xxx
из-за возможности их конфликта со встроенными процедурами в будущих версиях SQL Server.Поэтому это следует делать с осторожностью, а не просто создавать множество случайно названных процедур, которые вы считаете полезными.
Обычный простой способ избежать этого - добавить свой собственный префикс компании / личности к процедуре, которой занимается Microsoft.маловероятно использовать, например sp_MyCompany_MyCustomProcedure
.