【问题标题】:Using a query that is stored in a table使用存储在表中的查询
【发布时间】:2014-10-23 15:03:50
【问题描述】:

我的数据库有两个表: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 中。这是我想经常与更改进行比较的查询。

【问题讨论】:

  • 您使用的是哪个 RDBMS?
  • 执行存储在数据库中的 sql 对我来说根本不是一个好主意
  • 使用 MS SQL @Barranka
  • In my opinion this is the only solution that is maintenance free - 高级程序员如是说:“虽然程序只有三行,但总有一天它会被维护。” -- The Tao of Programming
  • 为什么不创建一个视图,而是将 sql 存储在您使用动态 sql 运行的表中?会让这类事情变得容易得多。

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


【解决方案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'+'))');

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-04-11
    • 2011-08-01
    • 2020-11-20
    • 2018-10-04
    • 2020-01-11
    • 1970-01-01
    • 2012-11-06
    • 2021-11-09
    相关资源
    最近更新 更多