如何基于不同数据库中的值访问数据库? (TSQL)

问题描述:

所以我有一个SQL Server正在运行,并且我有两个数据库,第一个数据库存储第二个数据库的名称。在第一个数据库中,我希望创建一个在第二个表修改数据的声明中,沿着线的东西:如何基于不同数据库中的值访问数据库? (TSQL)

(这是从第一个数据库查询)

select * from [select database_name from table1].table 

我一直在玩弄与系统。关键字试图找出我是否可以做到这一点,但没有运气。任何帮助将不胜感激,谢谢。

+0

如果您发布代码,XML或数据示例,请在文本编辑器中突出显示这些行,然后单击编辑器工具栏上的“代码示例”按钮(“{}”),以便对其进行精确格式化和语法突出显示! – 2011-03-14 19:49:44

您必须构建一个字符串并将其作为动态SQL执行。请参阅:The Curse and Blessings of Dynamic SQL

declare @database_name sysname 

select @database_name = database_name from Table1 

declare @sql nvarchar(1000) 

set @sql = N'select * from ' + @database_name + N'.SchemaName.TableName' 

exec sp_executesql @sql 
+0

感谢您的参考!爱标题:) – 2011-03-14 19:51:50

你可以做到这一点只能通过执行这样的动态查询:

DECLARE @base varchar(30) 
SELECT @base = "yourOtherBase" 
EXECUTE ("select * from " + @base + "..table"); 
+0

感谢您的信息,这完美的工作! – 2011-03-14 19:54:16

的一种方法是建立一些动态SQL,沿着线:

DECLARE @Command varchar(1000) 

SELECT @Command = replace('select * from <TargetDB>.dbo.table', '<TargetDB>', tabel1.database_name) 
from table1 
where [your criteria here] 

EXECUTE (@Command) 

另一种方法是创建引用“目标”数据库的视图(或同义词或链接的服务器定义),例如

DECLARE @Command varchar(1000) 

SELECT @Command = replace('CREATE VIEW SomeView AS select * from <TargetDB>.dbo.table', '<TargetDB>', tabel1.database_name) 
from table1 
where [your criteria here] 

EXECUTE (@Command) 

这将创建一个可以被永久(即非动态)代码引用的视图。如果目标数据库频繁更改,或者您拥有大量目标数据库,则这种方法效果不佳。

但说实话,真正的答案是不,你不能轻易做到这一点,而且你应该尽力避免必须这样做的情况。相信我,这可能是一个调试和维护的噩梦。

+0

@Joe是对的,如果你这样去使用'sp_executeSQL'。 – 2011-03-14 19:53:13