2012-03-10 1 views
2

サンプルコードは、別のデータベースのテーブルを参照してから現在のものを参照します。データベース名をハードコードしないでT-SQLストアドプロシージャから別のデータベースを参照する

use DB1 
select * from SomeTableInDB1 
select * from DB2..SomeTableInDB2 

質問:他のデータベース(「DB2」)の名前を何らかの形でソフトコードすることはできますか?あなたが唯一持っているので、あなたは一つの場所にデータベース名を変更するには、インターフェイスのビューを使用することができ

use DB1 
varchar @OtherDB 
set @OtherDB = "DB2" 
select * from SomeTableInDB1 
select * from @OtherDB..SomeTableInDB2 

答えて

8

ます。また、私が見つけ同義語を、使用することができますビューより少しきれいです(view shouldn't have SELECT *でも、基になるテーブルの変更に合わせて管理する必要があります)。

USE DB1; 
GO 
CREATE SYNONYM dbo.SomeTableInDB2 FOR DB2.dbo.SomeTableInDB2; 

は、これは事実上、単にリダイレクトです - だから今DB1にあなたが言うことができ、まだなどと同じように使用されている基本テーブルからインデックス:

SELECT * FROM dbo.SomeTableInDB2; 

...ハードコーディングすることなく、データベース。

詳細については、CREATE SYNONYM (MSDN)を参照してください。

+0

シノニムに関する1つの問題は、コードを読むときに何が起こっているのかが明白でないことです。私は命名規則でそれを緩和できると思います。 – Andomar

+0

私はこれが好きです!ありがとうアーロン! 1つの質問 - リンクされたサーバー上の表に同義語を作成できますか。つまり、別の物理サーバー上に別のDBが存在する場合 –

+1

はい、CREATE SYNONYM dbo.foo FOR server.db.dbo.bar; –

2

このような

何か(私はこれが動作しません知っているが、多分それは私の質問より明確になります):

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) 
+1

QuoteName関数でdb名を囲んでいた場合 - http://msdn.microsoft.com/en-us/library/ms176114.aspx – Bridge

+0

ビューではパフォーマンスが向上しますか? - ビューを照会するときにテーブルのインデックスを使用しますか? –

+0

クエリプランが作成される前にビューが展開されます。したがって、索引は、ビューを介して照会するときに使用されます。 – Andomar

関連する問題