我的数据库有两个表:t_computers
和t_queries
。
此查询显示哪些计算机是笔记本电脑
select *
from t_computers
where type = 'Laptop'
在表t_queries
中,我存储了动态SQL查询。
SELECT QuerySQL
from t_query
where QueryName = 'Clients that have not been started in 30 days'
第一个结果是SQL查询会给我这个信息。
现在对于复杂的部分,我只想选择具有“笔记本电脑”类型的计算机。如果我运行存储在表中的查询,则返回。
这样的事情
select *
from t_computers
where type = 'Laptop' and
(computer is returned for (SELECT QuerySQL
from query
where QueryName = 'Clients that have not been started in 30 days'))
这甚至可能吗?我正在使用SQL Server 2008 R2
我使用了一个非常简单的例子。 有关我为何要使用表中保存的查询的一些背景信息:使用我们的客户管理系统(类似于SCCM)管理员可以轻松创建"视图"客户例如,过滤掉所有IP为10. *的计算机。一旦保存视图,就会创建一个SQL查询并将其保存在表t_queries中。这个我要比较的查询经常发生变化。
答案 0 :(得分:1)
是的,这是可能的,但正如评论者所说,无论你多么信任它,我强烈建议你不要执行来自用户的任意代码。您几乎没有可能执行安全规则,并可能会破坏安全漏洞。
在其他系统中正确完成的方式是使用您解释的特定查询语言(自定义或不自定义),并在需要时“翻译”到SQL。这允许您将可能的操作限制为严格必要的操作。
在免责声明之后,这里是你的问题的答案(未经测试,我在这台笔记本电脑上没有SQL Server,所以我可能搞砸了一些引号):
exec('select *
from t_computers
where type = ''Laptop'' and
(computer is returned for ('+SELECT TOP(1) QuerySQL
from query
where QueryName = 'Clients that have not been started in 30 days'+'))');