我在一个名为
的数据库中有一个名为PROC_fetchTableInfo的存储过程(从sys.tables中简单选择)Cust
我想在另一个名为
的数据库中使用此过程Dept
我尝试使用命令
在此数据库中执行此spEXECUTE Cust.dbo.PROC_fetchTableInfo
但结果我从数据库Cust获取表。如何让这个程序在数据库部门工作?
答案 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