我有一个带有view_name字段的表(varchar(256)),我想在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,但欢迎使用跨平台的答案。
答案 0 :(得分: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)
答案 1 :(得分: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
警告!此代码未经过测试。这只是一个暗示......
答案 2 :(得分:0)
动态SQl是唯一的方法,这就是为什么这是一个糟糕的设计选择。如果您必须使用动态SQl以保护您的数据,请阅读以下文章。 http://www.sommarskog.se/dynamic_sql.html
答案 3 :(得分:0)
正如HLGEM所写,您被迫使用动态SQL这一事实表明设计本身存在问题。我还要指出,在这样的表中存储聚合很可能是另一种糟糕的设计选择。
如果您需要在某个时刻确定某个值,请在需要时执行此操作。试图保持与您的数据同步的计算值几乎总是充满问题 - 不准确,额外开销等。
极少数情况下,存储这样的值是必要的或具有优势,而这些通常是在非常大的数据仓库或具有极高吞吐量的系统中。学校或大学可能遇到的并不是什么。