sql - 如何创建根据特定设置访问不同表的 "materialized something"

标签 sql sql-server sql-server-2008 view

我想要一个程序来访问表/ View /存储过程等(具体化的东西,我们称之为 X),它抽象出三个基本表(表在所有位置都具有相同的定义)。

我希望X从某处(可能是一个表)获取服务器名称、目录名称和表名称,并访问特定的三个基本表。 X 的调用者不会知道正在调用哪些特定表。

如何在 SQL Server (2008) 中执行此操作?

最佳答案

与函数一样, View 无法使用动态 SQL - 它无法在某处查找元数据引用并进行相应调整。

我认为最接近你想要的是 synonym 。假设您有三个不同的数据库:ABC。在 A 中,您希望 View 引用的表是 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

现在这在技术上不是一个 View ,但在每个数据库中你可以说......

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

我仍然不明白这一点,而且我不知道当两个不同的用户期望同时调用您的程序时您打算做什么,并且他们每个人都应该从不同的位置获取结果。

关于sql - 如何创建根据特定设置访问不同表的 "materialized something",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12553711/

相关文章:

Oracle Group by NULL 中的 SQL 返回多行

sql - 复杂的TSQL自定义排名任务

c# - SQL Server中的存储过程;语法错误

sql - 在启动时运行 MS SQL 服务器脚本

sql-server-2008 - 使用 "With Clause"SQL Server 2008

sql - SQL 中的 'S' 是否代表 "standard"或 "structured"?

sql - MySQL MyISAM 表性能......痛苦地,痛苦地慢

sql - 如何将数据库列(及其数据)提取到新表中?

sql-server-2008 - 如何从另一个没有临时表的存储过程调用一个存储过程(带参数)

sql - 创建触发器来记录影响表的 SQL?