2011-06-27 39 views
1

所以我有一个分贝中的sproc ..让我们打电话给这个分区A。该数据库在另一个数据库中使用表(t1, t2)。让我们打电话给db B运行一个存储过程从一个不同的分区

好了,所以我现在把它叫做方法是:A.dbo.My_Proc,但我得到另一个错误:

Invalid object name 'dbo.t1'.

我这么多努力,提供的参数。在我的Sproc中,select * from @dbname.dbo.t1 但是这会导致错误。我不能把存储在db B中。

虽然硬编码是足够的(如果有办法),db B每年都会更改,所以“提供”数据库会很好。

我试过使用use B; go,但它给了我错误,说不能在一个存储过程中。

+0

请问你跑'A.dbo.My_Proc'有权限的数据库帐户? –

+0

是的。我的意思是,目前这一切工作,如果我手动输入。像'B.dbo.table1'从sproc ..但是我想'B'被提供。 – masfenix

回答

1

你可以创建一个同义词:

编辑:我现在所需要的表,而不是PROC同义词看到。让他们切换。所以,你可以在数据库B创建数据库中的一个同义词表:

USE A; 
CREATE SYNONYM dbo.t1 FOR B.dbo.t1; 

那么你在过程中可以简单地说:

SELECT * FROM dbo.t1; 

而无需手动提供数据库名称可言,查询知道(基于近义词)从表中获取数据库B.数据当数据库B更改为C,你可以简单:

DROP SYNONYM dbo.t1; 
CREATE SYNONYM dbo.t1 FOR C.dbo.t1; 

如果使用“真正的”数据库名称在你的叙述中,与任意的A/B名称相反,它可能会导致更容易的理解。只是一个建议。 :-)

/EDIT

另一种选择是在数据库名称来传递,并经由动态SQL构造。例如。而不是SELECT * FROM @ dbname.dbo.t1(这不会有任何效果),你可以这样做:

DECLARE @sql NVARCHAR(MAX) = N'SELECT * FROM ' + QUOTENAME(@dbname) + '.dbo.t1;'; 
EXEC sp_executesql @sql; 

但是,如果这个其他数据库名称真的只有一年一次的变化,我建议同义词路线比较好总体。

+0

为同义词+1 - 我打算提出动态SQL,但我认为同义词是一个更清洁解。 – JNK

+0

我不明白如何使用同义词路由?你能举一个更具体的例子吗?谢谢! – masfenix

+0

注意将简单的@dbname连接到执行的SQL中导致的SQL注入漏洞。 –

1

当您执行exec someDB.dbo.SomeProc时,执行上下文切换为someDB。所以如果程序发出SELECT FROM dbo.t1那么dbo.t1必须在someDB。如果你想程序从“提供”数据库中选择,则程序必须使用dynamic-SQL

create procedure someProc 
    @dbname sysname 
as 
begin 
... 
set @sql = N'SELECT ... FROM ' + quotename(@dbname) +N'.dbo.t1'; 
exec sp_executesql @sql; 
... 
end 
相关问题