gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 05:29:46 24 4
gpt4 key购买 nike

我想要一个程序来访问表/ 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com