Область хранимой процедуры: использование sp из другой базы данных - PullRequest
4 голосов
/ 15 октября 2010

У меня есть хранимая процедура с именем PROC_fetchTableInfo (простой выбор из sys.tables) в базе данных с именем

Cust

Я хотел бы использовать эту процедуру в другой базе данных с именем

Dept

Я пытался выполнить этот sp в этой базе данных, используя команду

EXECUTE Cust.dbo.PROC_fetchTableInfo

, но в результате я получаю таблицы из базы данных Cust.Как заставить эту процедуру работать в базе данных Dept?

Ответы [ 3 ]

6 голосов
/ 15 октября 2010

Хранимая процедура тесно связана с объектами в своем коде. Если Cust.dbo.PROC_fetchTable ссылается на таблицу T, то это строго таблица T в схеме dbo в базе данных Cust. Вы можете вызвать процедуру из любого другого места, она всегда будет ссылаться на эту таблицу.

Если вам нужно запустить ту же процедуру в другой таблице в другой базе данных, то лучшим решением, безусловно, будет новая процедура: Dept.dbo.PROC_fetxTableInfo. Это лучше, чем альтернатива использования Dynamic-SQL . Хотя это кажется нелогичным с точки зрения СУХОГО и повторного использования кода, T-SQL - это язык доступа к данным, а не язык программирования, при входе в базу данных оставьте свои мысли о C / C # у двери Просто сделайте еще одну процедуру в базе данных Dept.

2 голосов
/ 15 октября 2010

Это возможно (если вы пытаетесь написать какую-либо служебную функцию, которую вы можете использовать во всех базах данных).Вы можете создать его в базе данных master, присвоить ему префикс sp_ и пометить его как системный объект.

use master

go

CREATE PROCEDURE dbo.sp_sys_tables_select
AS
SELECT * FROM sys.tables 

GO

EXEC sys.sp_MS_marksystemobject 'dbo.sp_sys_tables_select'
GO


EXEC tempdb.dbo.sp_sys_tables_select

EXEC msdb.dbo.sp_sys_tables_select
2 голосов
/ 15 октября 2010

Ваша процедура, Cust.dbo.PROC_fetchTableInfo просматривает данные в базе данных Cust.Похоже, вам нужна его копия в базе данных Dept.

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

Возможно, вы могли бы создать его в некоторой базе данных "Common" и назвать его как EXEC Common..PROC_fetchTableInfo @databaseName='Dept'

...