使用存储在表中的查询

时间:2014-08-29 15:02:44

标签: sql sql-server select sql-server-2008-r2 nested

我的数据库有两个表:t_computerst_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中。这个我要比较的查询经常发生变化。

1 个答案:

答案 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'+'))');