Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 从T-SQL存储过程引用另一个数据库,而不硬编码数据库名称_Sql Server_Sql Server 2005_Tsql - Fatal编程技术网

Sql server 从T-SQL存储过程引用另一个数据库,而不硬编码数据库名称

Sql server 从T-SQL存储过程引用另一个数据库,而不硬编码数据库名称,sql-server,sql-server-2005,tsql,Sql Server,Sql Server 2005,Tsql,示例代码引用了不同数据库中的表,然后打开了当前数据库 use DB1 select * from SomeTableInDB1 select * from DB2..SomeTableInDB2 问题:另一个数据库(“DB2”)的名称是否可以进行软编码 类似这样的事情(我知道这不起作用,但可能会让我的问题更清楚) 您可以使用接口视图,因此只需在一个位置更改db名称: create view vw_Db2If_SomeTable as select * from DB2.dbo.SomeTabl

示例代码引用了不同数据库中的表,然后打开了当前数据库

use DB1
select * from SomeTableInDB1
select * from DB2..SomeTableInDB2
问题:另一个数据库(“DB2”)的名称是否可以进行软编码

类似这样的事情(我知道这不起作用,但可能会让我的问题更清楚)


您可以使用接口视图,因此只需在一个位置更改db名称:

create view vw_Db2If_SomeTable
as
select * from DB2.dbo.SomeTable
另一个选项是动态SQL:

declare @sql nvarchar(max)
set @sql = 'select * from ' + @OtherDB + '.dbo.SomeTable'
exec (@sql)

您还可以使用同义词,我发现它比视图更简洁(但也需要在基础表更改时进行维护)

这实际上只是一个重定向-来自基表的索引仍然以相同的方式使用,等等。因此,现在在DB1中,您可以说:

SELECT * FROM dbo.SomeTableInDB2;
…无需对数据库进行硬编码


有关更多信息,请参见。

如果我是你,我会在QuoteName函数中围绕db名称-对于视图-性能会受到影响吗?-查询视图时是否会使用表上的索引?在制定查询计划之前,会展开视图。因此,在通过视图进行查询时会使用索引。同义词的一个问题是,在阅读代码时,不清楚发生了什么。我想你可以通过命名约定来缓解这个问题。我喜欢这个!谢谢你,亚伦!一个问题-可以在链接服务器上的表上创建同义词吗。即,另一个数据库存在于不同的物理服务器上是的,为server.DB.dbo.bar创建同义词dbo.foo@Andomar:我喜欢将同义词放在一个不同的模式中,这个模式只适用于该数据库的同义词。例如,假设我有db_a,它需要与db_b和db_c同义。在db_a中,我将创建模式db_b和db_c,并将db_b的同义词放在模式db_b中,同样地,也放在db_c中。现在,阅读代码时很清楚,当您在模式db_b中看到“对象”时,它们是外部引用。@Andomar在查看视图的定义之前,视图也不明显。有时同义词的目的也是抽象。
USE DB1;
GO
CREATE SYNONYM dbo.SomeTableInDB2 FOR DB2.dbo.SomeTableInDB2;
SELECT * FROM dbo.SomeTableInDB2;