在SQL Server中访问具有动态名称的另一个数据库

时间:2008-11-04 10:07:11

标签: sql sql-server sql-server-2005

SQL Server 2005中有两个数据库:一个名为“A”,另一个名为“A_2”。 “A”是用户输入的变量名,第二个数据库的“_2”前缀始终是已知的。 (所以数据库可以是“MyDB”和“MyDB_2”等)

如何在不知道实际名称且不使用'exec'语句的情况下从存储过程中访问其他数据库?

3 个答案:

答案 0 :(得分:7)

您可以尝试使用称为“同义词”的新SQL Server 2005功能。

您需要CREATE SYNONYM,然后使用同义词编译并保存存储过程。这将使您有可能在以后“动态”更改同义词。显然,仍然需要将CREATE SYNONYM代码作为动态SQL运行。

要运行CREATE SYNONYM,必须为用户授予相应的权限,或者具有ALTER SCHEMA权限。在你走这条路线之前一定要阅读更多关于同义词的内容,附上几个字符串。

答案 1 :(得分:0)

我认为不可能。

名称是变量,您不能将变量用作数据库名称。

所以唯一的方法是将整个命令放到一个字符串并执行它,你想避免它。

整件事的目的是什么?如果您在逻辑上命名数据库会发生什么,但某处存储了逻辑与用户输入的名称之间的链接?

答案 2 :(得分:0)

我所做的是为我想要访问的每个表创建一个视图(可能是模式是相同的),然后我的后续代码只引用了视图。例如

if object_id('view_Table1') is not null
    drop view view_Table1

dim @cmd nvarchar(max)

set @cmd = 'create view view_Table1 as select * from ' + @DbName + '.dbo.Table1'

exec sp_executesql @cmd

select WhateverColumn from view_Table1