2008-12-02 72 views
1

我有一个view_name字段(varchar(256))的表,我想在sql查询中使用该字段。如何使用存储在字段中的查看名称进行sql查询?

实施例:

TABLE university_members

ID |键入| view_name |算上

1 |教授| view_professors | 0

2 |学生| view_students2 | 0

3 |员工| view_staff4 | 0

而且我想与相应的视图(例如..SET count = SELECT count(*) FROM view_professors)计算的一些汇总,更新所有行。

这可能是一个新手的问​​题,我猜它要么显然是不可能的或微不足道的。值得赞赏的是对设计的评论,即在这里处理元数据的方式(明确地将DB对象名称存储为字符串)。虽然我无法控制这种设计(所以我必须找出答案),但我猜测它并不那么干净,尽管一些外部约束决定了它,所以我非常感谢社区对我的个人利益的看法。

我使用SQL Server 2005,但跨平台的答案是受欢迎的。

回答

2

要做到这一点,你必须做一点动态SQL,这样的事情可能会奏效,显然你需要进行编辑才能真正匹配你想要做的事情。

DECLARE @ViewName VARCHAR(500) 

SELECT @ViewName = view_name 
FROM University_Members 
WHERE Id = 1 

DECLARE @SQL VARCHAR(MAX) 

SET @SQL = ' 
UPDATE YOURTABLE 
SET YOURVALUE = SELECT COUNT(*) FROM ' + @ViewName + ' 
WHERE yourCriteria = YourValue' 

EXEC(@SQL) 
0

我看到它的方式,你可以生成一个VARCHAR(MAX)变量的SQL代码,然后使用EXEC关键字执行它。就像你试过的那样,我不知道有什么办法可以直接做。

例子:

DECLARE @SQL VARCHAR(MAX) 
SET @SQL = '' 
SELECT @SQL = @SQL + 'UPDATE university_members SET count = (SELECT COUNT(*) FROM ' + view_name + ') WHERE id = ' + id + CHAR(10) + CHAR(13) FROM university_members 

EXEC @SQL 

警告!此代码未经测试。这只是一个提示...

0

正如HLGEM所写,您被迫使用动态SQL的事实表明设计本身存在问题。我还会指出,像这样在表格中存储聚合很可能是另一个糟糕的设计选择。

如果你需要在某个点确定的值,然后做,当你需要它。试图保持一个类似于您的数据同步的计算值几乎总是充满了问题 - 不准确,额外的开销等。

有非常罕见的情况下,存储这样的值是必要的或给予优势,这些都是通常在非常大的数据仓库或具有极高吞吐量的系统中。这不是学校或大学可能遇到的问题。

相关问题