如何使用存储在字段中的查看名称进行sql查询?
我有一个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,但跨平台的答案是受欢迎的。
要做到这一点,你必须做一点动态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)
我看到它的方式,你可以生成一个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
警告!此代码未经测试。这只是一个提示...
动态SQL是要做到这一点这就是为什么这是一个糟糕的设计选择的唯一途径。如果您必须使用动态SQl来保护您的数据,请阅读以下文章。 http://www.sommarskog.se/dynamic_sql.html
正如HLGEM所写,您被迫使用动态SQL的事实表明设计本身存在问题。我还会指出,像这样在表格中存储聚合很可能是另一个糟糕的设计选择。
如果你需要在某个点确定的值,然后做,当你需要它。试图保持一个类似于您的数据同步的计算值几乎总是充满了问题 - 不准确,额外的开销等。
有非常罕见的情况下,存储这样的值是必要的或给予优势,这些都是通常在非常大的数据仓库或具有极高吞吐量的系统中。这不是学校或大学可能遇到的问题。