存储过程范围:使用另一个数据库中的sp

时间:2010-10-15 17:26:54

标签: sql sql-server sql-server-2008 stored-procedures

我在一个名为

的数据库中有一个名为PROC_fetchTableInfo的存储过程(从sys.tables中简单选择)
Cust

我想在另一个名为

的数据库中使用此过程
Dept

我尝试使用命令

在此数据库中执行此sp
EXECUTE Cust.dbo.PROC_fetchTableInfo

但结果我从数据库Cust获取表。如何让这个程序在数据库部门工作?

3 个答案:

答案 0 :(得分:6)

存储过程与其代码中的对象紧密绑定。如果Cust.dbo.PROC_fetchTable引用了表T,则严格来说就是数据库T中架构dbo中的表Cust。您可以从任何其他地方调用该过程,它将始终引用此表。

如果您需要在另一个数据库中的另一个表中运行相同的过程,那么到目前为止,最佳解决方案是使用新的过程:Dept.dbo.PROC_fetxTableInfo。这比使用Dynamic-SQL的替代方法更好。虽然从DRY和代码重用的角度来看这似乎是违反直觉的,但是T-SQL是一种数据访问语言,它不是一种编程语言,当你进入数据库时​​,你的C / C#思维模式会被置于门外。在Dept数据库中只有另一个过程。

答案 1 :(得分:2)

您的程序Cust.dbo.PROC_fetchTableInfo查看Cust数据库中的数据。听起来你需要Dept数据库中的副本。

或者(对我来说非常不满意)您可以通过动态构建查询来添加一个控制要查询的数据库的参数。

也许您可以在某个"Common"数据库中创建它,并将其称为EXEC Common..PROC_fetchTableInfo @databaseName='Dept'

答案 2 :(得分:2)

这是可能的(如果您正在尝试编写一些可以在所有数据库中使用的实用程序功能)。您可以在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