SQL Server 2005中有两个数据库:一个名为“A”,另一个名为“A_2”。
“A”是用户输入的变量名,第二个数据库的“_2”前缀始终是已知的。 (所以数据库可以是“MyDB”和“MyDB_2”等)
如何在不知道实际名称且不使用'exec'语句的情况下从存储过程中访问其他数据库?
答案 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