関数と同様に、ビューは動的 SQL を使用できません。どこかでメタデータ参照を見つけて、それに応じて調整することはできません。
あなたが望むものに最も近いのはsynonymだと思います。と の 3 つの異なるデータベースがA
あるB
としC
ます。A
ビューが参照するテーブルではdbo.foo
、B
それはdbo.bar
であり、C
それはdbo.splunge
です。したがって、各データベースで次のようなシノニムを作成できます。
USE A;
GO
CREATE SYNONYM dbo.YourCommonViewName FOR dbo.foo;
GO
USE B;
GO
CREATE SYNONYM dbo.YourCommonViewName FOR dbo.bar;
GO
USE C;
GO
CREATE SYNONYM dbo.YourCommonViewName FOR dbo.splunge;
GO
これは技術的にはビューではありませんが、各データベースで言うことができます...
SELECT <cols> FROM dbo.YourCommonViewName;
...そして、データベース固有のテーブルからデータを返します。
これをストアド プロシージャで行う方がはるかに簡単です。たとえば、サーバー、データベース、およびテーブル名をいくつかのテーブルに保存するとしますdbo.lookup
。
CREATE TABLE dbo.lookup
(
id INT PRIMARY KEY,
[server] SYSNAME,
[database] SYSNAME,
[table] SYSNAME,
active BIT NOT NULL DEFAULT (0)
);
-- you may want a constraint or trigger to ensure
-- only one row can be active at any one time.
INSERT dbo.lookup(id, [server], [database], [table])
SELECT 1,N'serverA',N'databaseA',N'tableA'
UNION ALL SELECT 2,N'serverB',N'databaseB',N'tableB';
これで、プログラムは次のように言うことができます:
UPDATE dbo.lookup SET active = 1 WHERE ... ?
また、ストアド プロシージャは次のようになります。
CREATE PROCEDURE dbo.whatever
AS
BEGIN
SET NOCOUNT ON;
DECLARE @sql NVARCHAR(MAX);
SELECT @sql = N'SELECT <cols> FROM ' + QUOTENAME([server])
+ '.' + QUOTENAME([database]) + '.dbo.' + QUOTENAME([table])
FROM dbo.lookup WHERE active = 1;
EXEC sp_executesql @sql;
END
GO
私はまだ要点を理解していません.2 人の異なるユーザーが同時にあなたのプログラムを呼び出し、それぞれ別の場所から結果を取得する必要がある場合に、あなたが何をしようとしているのかわかりません.